我有一个名为Parent的模型,它看起来像这样(为了保护无辜者而替换了实际名称):
class Parent < ActiveRecord::Base
has_many :children
end
...以及一个名为Child的模型,看起来像这样:
class Child < ActiveRecord::Base
belongs_to :parent
end
在用于渲染Child模型实例的_form.html.erb中,我尝试为用户提供一个选择列表,以选择他们希望为其创建新Child的Parent。(要点:这样做违反了某些REST原理吗?我曾考虑过在父页面上交替添加一个“创建新子代”链接,该链接始终传递一个特定的父ID,但是不确定我不会遇到相同的问题)
因此,我已经渲染了选择列表,并在ChildController的New()方法中创建了一个@allparents数组:
<%= select_tag "parent_id", options_from_collection_for_select(@allparents, 'id', 'name') %>
但是,除了必须在select_tag声明中手动拼写“ parent_id”属性名称之外,我还必须像下面这样在ChildController的Create方法中从我的params数组中挑选出父_id:
def create @child = Child.new(child_params)
@child.parent_id = params[:parent_id]
# save it
end
尽管此方法有效,但我感觉要手动将子项与其child.parent_id属性相关联时,我不得不写一些“胶水”,但我觉得必须有更好的方法,但是我无法找出合适的Google Fu自己解决这个问题。
最后一个想法:对我来说,我缺少的最大指示是,当我触发一个强烈的参数错误时,我看到正在为我构造我的子模型对象,但是parent_id是一个完全独立的实体:
参数:
{"utf8"=>"√",
"authenticity_token"=>"asdefkaheaikehualshalhf",
"parent_id"=>"2",
"child"=>{"versionnumber"=>"some user input value"},
"commit"=>"Create Child"}
似乎我的解决方案很脆弱,因此,如果有人更改了Child的parent_id属性名,则我的视图将中断。有谁看到更好的方法来解决这个问题?谢谢你。
我建议您看一下一些其他在线资源,例如railscast或rails guides,以获得有关如何在rails中使用表单的良好概述。
通常,使用form_for @model do
模式是个好主意。
它会创建一个表单帮助器,您可以在其中轻松映射模型字段和表单名称。
因此,在您的情况下,它看起来像这样:
= form_for @child do |f|
= f.collection_select(:parent, Parent.all, :id, :name, :prompt => "Select a Parent")
= f.submit
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句