2012-02-16 87 views
1

我自己的看法,其中正确创建一个HTML <select>菜单一个有collection_select,但是当我选择一个选项,它并不在数据库中保存。在同一个视图中,我有来自同一个数据库表的其他领域,他们保存起来。这里是我的模型:collection_select不保存所选的选项在数据库

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

你有'TrainingPart'模型中的attr_accessible:activity_id? – Substantial 2012-02-16 11:16:06

+0

不,当我添加它时出现以下错误:'不能批量分配受保护的属性:数量' – maya 2012-02-16 11:26:23

回答

1

我设法做到这一点。事实证明,我有2个错误:

1)我不得不从视图中删除<%= f.text_field :activity_id %>,因为这是我试图用选择菜单设置的字段。

2)我应该用f.collection_select代替collection_select

0

允许大规模分配到你想要从视图中可设置的任何属性:

attr_accessible :activity_id, :amount # ...any others... 

“海量任务”是指一次从视图数据,如设置许多属性形式。这些属性在默认情况下受到保护,以防止用户注入自己的值(例如,admin = true)。

使用attr_accessible声明一个模型的属性是质量分配。

此外,由于您接受Activity的嵌套属性,因此必须在可访问属性列表中包含:activity_attributes

0

对我来说,问题是,我没有白名单在我的控制器领域。

假设你选择菜单有博客文章作为选项,这样你可以选择什么博客评论属于

f.collection_select :post_id, Post.all, :id, :name 

然后,你需要允许post_idCommentsController

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