This video表示可以保护通过控制器输入的输入,但仍然可以通过模型和规格进行质量分配。但是,在3.2.8中使用strong_parameters时,我没有将此文档记录为功能。
我知道我需要将ActiveModel::ForbiddenAttributesProtection
混合到我的模型中,并在config.active_record.whitelist_attributes = false
中设置config/application.rb
。我还从模型中提取了所有attr_accessible
次来电。
无论有没有mixin我都会遇到质量分配错误。
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: home_phone, cell_phone
我错过了什么吗?
答案 0 :(得分:22)
建议的RailsCast可能是一个好的开始,但是这里总结了你需要在Rails 3.x中做些什么才能使强参数工作而不是attr_accessible:
将gem 'strong_parameters'
添加到您的Gemfile并运行包。
在config / application.rb中注释掉(或设置为false)config.active_record.whitelist_attributes = true
混合模型中的ActiveModel::ForbiddenAttributesProtection
。按模型执行此操作,或全局应用于所有模型:
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
(railscast建议在新的初始化程序中执行此操作:config / initializers / strong_parameters.rb)
从现在开始,您将不得不使用如下语法:
model_params = params[:model].permit( :attribute, :another_attribute )
@model.update_attributes( model_params )
更新模型时。在这种情况下,除params[:model]
和:attribute
之外的:another_attribute
中的任何属性都会导致ActiveModel :: ForbiddenAttributes错误。
您还可以使用ActionController::Parameters
中剩余的新魔法,例如.require(:attribute)
来强制存在属性。
答案 1 :(得分:2)
它与您的问题不同,但可能会出现其他人获得MassAssignmentSecurity :: Error。即使我已经采取了规定的步骤切换到使用强参数而不是质量分配保护,我也遇到了'id'和'type'属性似乎默认受保护的问题。我有一个名为'type'的关联,我将其重命名为'project_type'来解决问题(该属性已经是project_type_id)。