如何让ActiveAdmin使用强参数?

更新:这个问题在ActiveAdmin中已经有了一个解决scheme。 正如Joseph所说,ActiveAdmin文档现在包含了这些信息,但是这里的答案是为使用旧版ActiveAdmin的人提供的。

当Rails 3.2.8中的ActiveAdmin 0.5.0使用strong_parameters 0.1.4时,如果您使用的模型正在使用StrongParameters,包括:

include ::ActiveModel::ForbiddenAttributesProtection 

那么如果您尝试创build/编辑logging,则会在日志中出现以下错误:

 ActiveModel::ForbiddenAttributes (ActiveModel::ForbiddenAttributes) 

现在文档清楚地说明了如何在Rails中设置强参数4.请参阅:

https://github.com/gregbell/active_admin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters

更新到最新的inherited_resources gem并在控制器块中执行以下操作:

 ActiveAdmin.register Blog do #... controller do #... def permitted_params params.permit(:blog => [:name, :description]) # params.permit! # allow all parameters end end end 

我接受的答案对于引擎中定义的资源并不适用,因此我追踪了inheritedresources / lib / inherited_resources / base_helpers.rb中的原始resource_params,并提出了更接近该代码的解决scheme,该scheme适用于引擎:

config/initializers/active_admin.rb

 ActiveAdmin::ResourceController.class_eval do # Allow ActiveAdmin admins to freely mass-assign when using strong_parameters def resource_params [(params[resource_request_name] || params[resource_instance_name]).try(:permit!) || {}] end end 

在你的config / initializers / active_admin.rb中

 config.before_filter do params.permit! end 

更新:请参阅@ Brendon-Muir的最新解决方法。 以下信息在以前是正确的,所以我会把它留在这里,以防其他人使用旧版本的ActiveAdmin。

在Google小组讨论中提出了一个补丁程序: https : //groups.google.com/forum/?fromgroups=#!topic/ activeadmin/ XD3W9QNbB8I

然后在这里放在一起: https : //github.com/gregbell/active_admin/issues/1731

但是现在,在您的应用中为ActiveAdmin添加强参数支持的侵入性最小的方法是通过“允许所有参数”方法重新定义您的控制器块中的resource_params,这是不太安全的:

 controller do def resource_params return [] if request.get? [ params[active_admin_config.resource_class.name.underscore.to_sym].permit! ] end end 

或更安全的明确方式:

 controller do def resource_params return [] if request.get? [ params.require(:name_of_model).permit(:each,:param,:goes,:here,:if,:you,:want) ] end end 

请参阅修改控制器上的Active Admin文档:
http://activeadmin.info/docs/8-custom-actions.html#modify_the_controller

你也可以使用permit_params如下:

 ActiveAdmin.register Resource do permit_params do %i(first_name last_name) end index pagination_total: false do column :id column :first_name column :last_name actions end end