Rails 3&强参数,导致质量分配错误

时间:2013-05-01 12:26:13

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

我正在尝试在我的Rails 3项目中使用单个模型中的强参数,该项目有大约40-50个模型。

我已经完成了以下操作,但是当我尝试创建或更新此模型的实例时,我得到了与质量分配相同的错误,如下所示,它显示了模型的每个字段。

我尝试从模型中删除accepted_nested_attributes_for并重新启动网络服务器,但它对我收到的错误没有影响。

配置/ application.rb中

config.active_record.whitelist_attributes = false

app / models / my_service.rb (为了简洁而连接)

class CallService < ActiveRecord::Base

  include ActiveModel::ForbiddenAttributesProtection

  belongs_to :account
  has_many :my_service_chargeables
  accepts_nested_attributes_for :my_forward_schedules, allow_destroy: true


  validates  :start_date, :username, :account_id, :plan_id, presence: true
  audited associated_with: :account

  scope :enabled, where(enabled: true)
  scope :within, lambda{|month| where(start_date: (month.beginning_of_month..month.end_of_month))}

end

应用/控制器/ my_services_controller.rb

def update
  @my_service = MyService.find(params[:id])
  if @my_service.update_attributes(permitted_params.my_service)
    flash[:success] = "Service Updated"
    redirect_to @my_service
  else
    render 'edit'
  end
end

应用/控制器/ application_controller.rb

def permitted_params
  @permitted_params ||= PermittedParams.new(current_user, params)
end

应用/模型/ permitted_pa​​rams.rb

class PermittedParams < Struct.new(:user, :params)
  def my_service
    if user && user.role?(:customer)
      params.require(:my_service).permit(*service_customer_attributes)
    else
      params.require(:my_service).permit!
    end
  end

  def service_customer_attributes
    [:timeout, :pin, :day]
  end
end

更新错误

ActiveModel::MassAssignmentSecurity::Error in MyServicesController#update

Can't mass-assign protected attributes: account_id, plan_id, start_date, username

我运行了一个调试器来确认代码从params.require(:my_service).permit!类命中PermittedParams行,但是这个异常仍然会被抛出,据我所知,应该什么都没有导致此模型需要将属性声明为attr_accessible's。

任何人都可以对这种行为有所了解吗?

我正在使用gem版本(来自我的 Gemfile.lock ):

strong_parameters (0.2.0)
rails (3.2.11)

1 个答案:

答案 0 :(得分:2)

我不确定你的具体用例是什么,但在这里做params.require(:my_service).permit!似乎仍然是一个坏主意,至少有人仍然可以覆盖你模型的PK。而不是params.require(:my_service).permit!为什么不这样做:

params.require(:my_service).permit(:timeout, :pin, :day, :account_id,
  :plan_id, :start_date, :username)

或者将它们保存在另一个数组中,并将它们与现有的service_customer_attributes合并,以使其保持干燥状态。

这会照顾您的质量分配错误,并且会更安全,更明确。