assign_attributes和ActiveModel :: ForbiddenAttributesError

时间:2013-10-28 23:31:46

标签: ruby-on-rails ruby ruby-on-rails-4

在我的应用程序中,我决定将部分逻辑移动到名为CategoryForm的额外类中,该类专用于ActiveRecord Category类。不幸的是,当我将params传递到Category时,ActiveModel::ForbiddenAttributesError被提升了。 这是Category类:

class Category < ActiveRecord::Base

  has_many :subcategories

  accepts_nested_attributes_for :subcategories

end

CategoryForm类:

class CategoryForm

  attr_accessor :model

  def initialize(model, params = {})
    @model = model
    @model.assign_attributes(params)
    build_subcategories
  end  

  def save
    delete_empty_subcategories
    @model.save
  end  

  private

  def build_subcategories
    8.times { @model.subcategories.build}
  end

  def delete_empty_subcategories
    @model.subcategories.each { |subcategory| subcategory.delete if subacategory.empty?}
  end  

end  

和CategoryController片段:

def create
    @category = Category.new
    @category_form = CategoryForm.new(@category, params[:category])

错误指向@model.assign_attributes(params)行,据我了解,我的Category无法使用子类别的参数。但另一方面,这就是nested_attributes的用途......任何想法如何正确启用它或者还有什么错误?

2 个答案:

答案 0 :(得分:3)

您遇到的错误来自Strong Parameters,它已在Rails 4中添加。请在控制器中尝试此代码,以通过强参数过滤参数:

def create
  @category = Category.new
  @category_form = CategoryForm.new(@category, category_params)
  # ...
end

private
  def category_params
    params.require(:category).permit!
  end

答案 1 :(得分:0)

只是为了完成答案,您可以在rails 4 protected_attributes gem中使用,这样您就可以attr_accessible使用rails3。关于这个问题,这是一个很棒的railscast。 `