Как заставить ActiveAdmin работать с сильными параметрами?

Update: этот вопрос был задан до того, как было решение для него уже в ActiveAdmin. Как утверждает Джозеф, документация ActiveAdmin теперь содержит эту информацию, но ответы здесь приведены для тех, кто работает со старыми версиями ActiveAdmin.

когда strong_parameters 0.1.4 используется с ActiveAdmin 0.5.0 в Rails 3.2.8, если используемая модель использует StrongParameters, включая:

include ::ActiveModel::ForbiddenAttributesProtection

затем вы получаете следующая ошибка в журнале при попытке создать / изменить запись:

ActiveModel::ForbiddenAttributes (ActiveModel::ForbiddenAttributes)

6 ответов


в документации теперь четко указано, как настроить сильные параметры в 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

принятый ответ не работал для меня с ресурсами, определенными в движке, поэтому я отследил исходные resource_params в inherited_resources/lib/inherited_resources/base_helpers.rb и придумал это решение, которое ближе имитирует этот код и которое работает с двигателями:

на 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

Update: см. ответ @Brendon-Muir для последнего способа сделать это. Следующая информация была правильной ранее, поэтому я оставлю ее здесь, если она поможет другим с более старой версией ActiveAdmin.

патч был предложен в потоке группы google: https://groups.google.com/forum/?fromgroups=#!тема/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

см. активные документы администратора об изменении controllers:
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