Rails复杂表单:选择和使用模板

时间:2012-02-01 06:49:11

标签: ruby-on-rails ruby-on-rails-3

class Project < ActiveRecord::Base 
  has_one :template 
end 

class Template < ActiveRecord::Base 
  belongs_to :project, foreign_key: "project_id" 
  belongs_to :admin
end 

class Admin < ActiveRecord::Base 
  has_many :templates
end 

鉴于我是用户,我想在创建新项目时选择模板。

然后我想编辑@project&amp; @ project.template而不更改管理员模板。

== ISSUE ======

我无法找到显示如何:

的资源
  • 收集Template.all
  • 的collection_select
  • 将所选模板的属性(除了:id)传递给@ project.build_template
  • 创建与新项目
  • 关联的模板的新实例(包含关联和属性)

2 个答案:

答案 0 :(得分:1)

这是一种方法。首先,您需要在Project new action中构建一个新模板。

template.build

然后添加collection_select。像这样:

<%= f.collection_select(:random_virtual_attribute, Templates.all, :id, :name, {:include_blank => true}, {:multiple => false} ) %>

然后附加到选择的更改事件。当它发生变化时,发出JSON请求以获取该特定模板。您可以使用respond_to和respond_with,http://davidwparker.com/2010/03/09/api-in-rails-respond-to-and-respond-with/。在JSON请求的回调中,设置您构建的模板的所有fields_for。

答案 1 :(得分:0)

我达成的解决方案是

(1)范围管理员创建的模板。不要显示重复项。

应用程序/模型/ template.rb

scope :unique_title, where(admin: true).order(:title).select("DISTINCT title").select(:id)

(2)收集表格

中的范围模板

项目/ create.html.haml

= simple_form_for @project do |f|
  = simple_fields_for :template do |template_form|
    = template_form.input :id, collection: admin.templates.unique_title

(3)创建一个新项目&amp;然后调用Project中的方法,根据@ template的属性

创建一个新模板

应用程序/控制器/ projects_controller.rb

def create
  @project = Project.new(params[:project[)
  @template = Template.find(params[:template][:id])
  if @project.save
    @project.create_new_template(@template)
  ....normal stuff here....
end

(4)在Project

中创建新模板对象
  def create_new_template(template)
    self.build_template do |t|
      t.title = template.title
      ...other template attributes here....
      t.save!
    end
  end

这有效但让我想洗澡......控制器变得太混乱了。我想在项目中实例化新模板after_create但是我不知道如何访问模板参数。如果我可以重构,将发布解决方案。如果有人有任何建议/批评,他们会受到极大的欢迎。