collection_select未在数据库中保存选定的选项

时间:2012-02-16 11:09:28

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

我的一个视图中有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

3 个答案:

答案 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