web-dev-qa-db-fra.com

Comment faire fonctionner ActiveAdmin avec des paramètres forts?

Mise à jour: cette question a été posée avant qu'il n'y ait déjà une solution pour cela dans ActiveAdmin. Comme le dit Joseph, la documentation ActiveAdmin contient maintenant ces informations, mais les réponses ici sont fournies pour ceux qui travaillent avec des versions plus anciennes d'ActiveAdmin. =

Lorsque le strong_parameters 0.1.4 est utilisé avec ActiveAdmin 0.5.0 dans Rails 3.2.8, si le modèle que vous utilisez utilise StrongParameters en incluant:

include ::ActiveModel::ForbiddenAttributesProtection

alors vous obtenez l'erreur suivante dans le journal si vous essayez de créer/modifier un enregistrement:

ActiveModel::ForbiddenAttributes (ActiveModel::ForbiddenAttributes)
42
Gary S. Weaver

La documentation indique maintenant clairement comment procéder pour configurer des paramètres forts dans Rails 4. Voir:

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

31
Joseph N.

Mettez à jour la dernière gemme inherited_resources et faites-le dans votre bloc contrôleur:

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

La réponse acceptée ne fonctionnait pas pour moi avec des ressources définies dans un moteur, j'ai donc retrouvé les ressources_params d'origine dans inherited_resources/lib/inherited_resources/base_helpers.rb et j'ai trouvé cette solution qui imite de plus près ce code et qui fonctionne avec les moteurs:

Dans 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
19
Nick Urban

dans votre config/initializers/active_admin.rb

config.before_filter do
  params.permit!
end
19
Manish Kasera

Mise à jour: Voir la réponse de @ Brendon-Muir pour la dernière façon de le faire. Les informations suivantes étaient correctes précédemment, je vais donc les laisser ici au cas où cela aiderait les autres avec une ancienne version d'ActiveAdmin.

Un correctif avait été proposé dans un fil de discussion Google: https://groups.google.com/forum/?fromgroups=#!topic/activeadmin/XD3W9QNbB8I

Puis était en train d'être mis en place ici: https://github.com/gregbell/active_admin/issues/1731

Mais pour l'instant, la façon la moins invasive d'ajouter une prise en charge de paramètres forts à ActiveAdmin dans votre application est de redéfinir resource_params dans votre bloc contrôleur, soit via la méthode "autoriser tous les paramètres", qui est moins sécurisée:

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

ou de manière explicite plus sûre:

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

Voir les documents Active Admin sur la modification des contrôleurs:
http://activeadmin.info/docs/8-custom-actions.html#modify_the_controller

6
Gary S. Weaver

Vous pouvez aussi utiliser permit_params comme suit:

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
3
Davidslv