0

假设我有两个模型:

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'

当我提交表单时,我收到错误 Can't mass-assign protected attributes: category ,我理解。为了解决问题,我将 category_id 添加到文章的 attr_accessible 并将表单更改为:

= f.label :category_id
 = f.collection_select(:category_id, Category.all, :id, 
  :name,{:prompt => 'select category'}, {:style => 'height:50px;'})

然后一切正常(我可以在数据库中创建具有关联 category_id 的 Article 对象),但我认为这不是正确的方法。下面是我在 ArticlesController 中的创建操作

def create
    @article = Article.new(params[:article])
    if @article.save
      redirect_to([:admin,@article])
    else
      render 'new'
    end

  end

有人可以解释我如何改善这一点。

4

1 回答 1

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 标志)的属性。

于 2013-04-13T21:04:54.243 回答