【问题标题】:How to get ActiveAdmin to work with Strong Parameters?如何让 ActiveAdmin 使用强参数?
【发布时间】:2012-10-26 16:42:21
【问题描述】:

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

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

include ::ActiveModel::ForbiddenAttributesProtection

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

ActiveModel::ForbiddenAttributes (ActiveModel::ForbiddenAttributes)

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果你想允许所有参数(毕竟这是你的管理界面)你可以使用params.permit!
    • 有没有办法让params.permit!全球......即所以我不必把它放在每个 ActiveAdmin.register 文件中?
    • 我不确定抱歉。最好在 ActiveAdmin 论坛中提问(如果有的话?我不太记得了):)
    • 我还在 config/application.rb 中指定了config.active_record.whitelist_attributes = false
    【解决方案2】:

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

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

    【讨论】:

    • (更新后显示这是当前 AA 版本的正确答案。)
    • 不幸的是,这在 Rails 3 或 6.x 版本上不可用。所以我只是在活动管理员初始化程序中修补了方法。
    【解决方案3】:

    对于在引擎中定义的资源,接受的答案对我不起作用,因此我在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
    

    【讨论】:

      【解决方案4】:

      在您的 config/initializers/active_admin.rb 中

      config.before_filter do
        params.permit!
      end
      

      【讨论】:

      • 就像我上面的第一个解决方案一样,值得注意的是这并不安全。我建议上面的 Brendon Muir 的解决方案明确允许控制器块中的参数,这在 Rails 4 here 的相关 ActiveAdmin 线程中多次提到。不过,这需要更多工作,因此请权衡风险与收益。
      【解决方案5】:

      更新:请参阅@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

      【讨论】:

        【解决方案6】:

        您也可以使用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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-18
          相关资源
          最近更新 更多