假设我有两个模型:
class Article < ActiveRecord::Base
belongs_to :category
attr_accessible :content
validates :content, :category, :presence => true
end
和
class category < ActiveRecord::Base
attr_accessible :name
has_many :articles
end
我正在创建一个表单来添加新文章,并且在此表单中希望为用户提供从列表中选择一个类别的可能性。
= form_for([:admin,@article] , :html => {:multipart => true}) do |f|
= f.label :category
= f.collection_select(:category, Category.all, :id,
:name,{:prompt => 'select category'}, {:style => 'height:50px;'})
= f.label :content
= f.text_area :content, class: 'tinymce', cols:60, rows: 15
%hr
= f.submit 'send'
当我提交表单时,我收到错误无法批量分配受保护的属性:类别,我理解。 要解决问题,我将category_id添加到Article的attr_accessible并将表单更改为:
= f.label :category_id
= f.collection_select(:category_id, Category.all, :id,
:name,{:prompt => 'select category'}, {:style => 'height:50px;'})
然后一切正常(我可以在db中创建带有关联category_id的Article对象),但我不认为这是一种正确的方法。 下面是我在ArticlesController中的创建操作
def create
@article = Article.new(params[:article])
if @article.save
redirect_to([:admin,@article])
else
render 'new'
end
end
有人可以解释我如何改善这一点。
答案 0 :(得分:1)
如果您不想使属性可分配,则需要使用其名称直接调用它:
def create
@article = Article.new(params[:article][:content])
@article.category_id = params[:article][:category_id]
if @article.save
redirect_to([:admin,@article])
else
render 'new'
end
end
在这种情况下,质量分配漏洞看起来很小,所以留下它可能没问题。您要避免的是通过发送任意形式的POST来暴露用户可能恶意设置模型属性(例如user.admin标志)的任何属性。