我有三个模型,它们之间有多态关系: 类别,部门和课程。课程既可以属于某个类别,也可以属于某个部门,不属于两者。
在课程模型中,我将其设置如下:
belongs_to :parent, :polymorphic => true
accepts_nested_attributes_for :parent
对于类别和部门模型,我定义了以下关系:
has_many :courses, :as => :parent
现在在课程视图中,我希望能够通过选择框为我正在编辑的课程设置合适的父级。 我在_form.html.erb中有下一行:
<%= f.collection_select( :parent_id, @parent_options, :id, :name, {}, { :multiple => false } ) %>
这会将正确的parent_id返回到数组中的哈希值。当我查看数据库中的记录时,它总是将1作为parent_id存储在courses表中(数组中的项目数?)并且根本不存储相应的名称(这并不奇怪,因为它没有通过通过参数)。
我明白这是错的,但无法弄清楚我应该做些什么。
@parent_options实例变量在控制器中加载了所有可能的类别和扇区,如下所示:
@parent_options = Admin::Sector.where(:visible => true) + Admin::Category.where(:visible => true)
我在railscasts和这个网站上找到了很多关于处理多态关系的信息,但是所有人都假设你想要从文章(类别或部门)中添加评论(我的例子中的课程)而不是其他四处走动。
感谢您的帮助!
在HTML中存在以下内容:
<select id="admin_course_parent_id" name="admin_course[parent_id][]"><option value="2">Verzekeraars</option>
<option value="2">Verkooptraining</option>
<option value="3">Specifieke Branches</option></select><select id="admin_course_parent_id" name="admin_course[parent_id][]"><option value="2">Verzekeraars</option>
<option value="2">Verkooptraining</option>
<option value="3">Specifieke Branches</option></select>
当我点击更新/保存按钮时,这是参数的值:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"my token", "admin_course"=>{"name"=>"Afsluittechnieken", "position"=>"1", "permalink"=>"afsluiten", "visible"=>"1", "description"=>"Hier leer je afsluittechnieken", "parent_id"=>["3"]}, "commit"=>"Update Course", "id"=>"1"}
“parent_id”=&gt; [“3”]声明所选父级的正确ID,但它不会将值存储到数据库中。
到目前为止,我还有很长的路要走。不再有作为parent_id发送的数组。我还设法在onchange动作之后从隐藏字段设置parent_type。但是还有一个问题,如何根据集合选择框中的选定值动态填充值?我现在使用以下语句:
<%= f.collection_select( :parent_id, @parent_options, :id, :name, {}, { :onchange => "this.form.admin_course_parent_type.value = 'WHAT GOES HERE'"}) %>
想知道这里有什么。我必须以某种方式读出所选值的类。尝试了#{':parent_id.class'}之类的东西,但它给了Symbol作为结果(不太令人惊讶)。
目前该模型接受所有类型的输入作为parent_type,真的希望有一天我不会遇到麻烦。我想知道下次在编辑时加载页面时选择框是否会选择正确的值,但我们稍后会看到。
答案 0 :(得分:0)
“parent_id”=&gt; [“3”]声明所选父级的正确ID,但它不会将值存储到数据库中。
您有两个使用相同名称admin_course[parent_id][]
呈现的选择。这就是为什么在数组"parent_id"=>["3"]
中返回所选的parent_id值的原因。
此数组不能存储在DB中的parent_id字段中(您只能通过此关系存储一个parent_id:belongs_to :parent, :polymorphic => true
)。
修复选择框的复制,它应该在末尾没有[]
的名称属性,以正确传递parent_id值。