我正在尝试在我的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_params.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)
答案 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
合并,以使其保持干燥状态。
这会照顾您的质量分配错误,并且会更安全,更明确。