我的一个视图中有collection_select
,它正确创建了一个HTML <select>
菜单,但是当我选择一个选项时,它不会保存在数据库中。在同一个视图中,我有来自同一个db表的其他字段,它们可以节省。这是我的模特:
class TrainingPart < ActiveRecord::Base
belongs_to :activity
belongs_to :training
accepts_nested_attributes_for :activity, :allow_destroy => true
end
class Activity < ActiveRecord::Base
has_many :training_parts
end
部分是:
<div class="part">
<%= f.label :activity, "Activity" %>
<%= collection_select :training_part, :activity_id, Activity.all, :id, :name %>
<%= f.text_field :activity_id %>
<%= f.text_field :amount %>
</div>
amount
字段工作正常。
编辑:我不在任何模型中使用attr_accessible
,因此可以访问所有表中的所有字段。 (参考:Rails mass assignment definition and attr_accessible use)
答案 0 :(得分:1)
我设法做到了。原来我犯了两个错误:
1)我不得不从视图中删除<%= f.text_field :activity_id %>
,因为这是我尝试使用选择菜单设置的字段。
2)我应该使用f.collection_select
代替collection_select
答案 1 :(得分:0)
允许将质量分配到您希望从视图中设置的任何属性:
attr_accessible :activity_id, :amount # ...any others...
“质量分配”表示使用视图中的数据(例如来自表单)一次设置多个属性。默认情况下,这些属性受到保护,以防止用户注入自己的值(例如admin = true
)。
使用attr_accessible
声明模型的哪些属性可以进行质量分配。
此外,由于您接受Activity
的嵌套属性,因此必须在可访问属性列表中包含:activity_attributes
。
答案 2 :(得分:0)
对我来说,问题是我没有将控制器中的字段列入白名单。
假设您的选择菜单包含博客文章作为选项,以便您可以选择评论所属的博客
f.collection_select :post_id, Post.all, :id, :name
然后,您需要在post_id
CommentsController
def update
# ...
if @comment.update_attributes(post_params)
# ...
end
def post_params
params.require(:comment).permit(:name, :post_id) # Make sure the field used with your select menu is permitted!
end