如何让ActiveAdmin使用强参数?

时间:2012-10-26 16:42:21

标签: ruby-on-rails ruby-on-rails-3.2 activeadmin strong-parameters

更新:在ActiveAdmin中已经有解决方案之前询问了这个问题。正如约瑟夫所述,ActiveAdmin文档现在包含此信息,但此处的答案是为使用旧版ActiveAdmin的人提供的。

当strong_parameters 0.1.4与Rails 3.2.8中的ActiveAdmin 0.5.0一起使用时,如果您使用的模型使用StrongParameters,则包括:

include ::ActiveModel::ForbiddenAttributesProtection

如果您尝试创建/编辑记录,则会在日志中收到以下错误:

ActiveModel::ForbiddenAttributes (ActiveModel::ForbiddenAttributes)

6 个答案:

答案 0 :(得分:59)

更新到最新的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

答案 1 :(得分:31)

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

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

答案 2 :(得分:19)

接受的答案对于我在引擎中定义的资源不起作用,所以我在inherited_resources / lib / inherited_resources / base_helpers.rb中找到了原始的resource_params,并提出了这个更接近模仿该代码的解决方案,哪个有效发动机:

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

答案 3 :(得分:19)

在config / initializers / active_admin.rb

config.before_filter do
  params.permit!
end

答案 4 :(得分:6)

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

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

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

但是现在,在应用程序中为ActiveAdmin添加强参数支持的最小侵入性方法是通过“permit all params”方法重新定义控制器块中的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

答案 5 :(得分:3)

您还可以按如下方式使用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