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 ======
我无法找到显示如何:
的资源答案 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但是我不知道如何访问模板参数。如果我可以重构,将发布解决方案。如果有人有任何建议/批评,他们会受到极大的欢迎。