如何让ActiveAdmin使用强参数?

Gar*_*ver 42 ruby-on-rails activeadmin ruby-on-rails-3.2 strong-parameters

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

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

include ::ActiveModel::ForbiddenAttributesProtection
Run Code Online (Sandbox Code Playgroud)

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

ActiveModel::ForbiddenAttributes (ActiveModel::ForbiddenAttributes)
Run Code Online (Sandbox Code Playgroud)

Bre*_*uir 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
Run Code Online (Sandbox Code Playgroud)

  • 如果你想允许所有参数(毕竟这是你的管理界面),你可以使用`params.permit!`. (11认同)

Nic*_*ban 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
Run Code Online (Sandbox Code Playgroud)


Man*_*era 19

在config/initializers/active_admin.rb中

config.before_filter do
  params.permit!
end
Run Code Online (Sandbox Code Playgroud)

  • 就像我上面的第一个解决方案一样,值得注意的是,这并不那么安全。我建议上面的 Brendon Muir 解决方案明确允许控制器块中的参数,这在 Rails 4 的相关 ActiveAdmin 线程中多次提到[此处](https://github.com/gregbell/active_admin/issues/1963 )。不过,这需要更多的工作,因此请权衡风险与收益。 (2认同)

Gar*_*ver 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
Run Code Online (Sandbox Code Playgroud)

或更安全的显式方式:

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

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