1

Comment puis-je ajouter des paramètres forts à mon contrôleur en utilisant un fichier concerné?Comment puis-je ajouter des paramètres forts à mon contrôleur en utilisant un fichier concerné?

Disons que je :name, :age, :sex les paramètres qui sont utilisés par plusieurs contrôleurs, mon idée est de créer un module de préoccupation où je stocke ces common_params et les ajouter aux paramètres autorisés que j'essaie vaguement de faire ici-bas.

Contrôleur

class PersonController < ApplicationController 
    include CommonHelper 

    def update 
    @person.create(person_params) 
    end 

    private 

    def person_params 
     params.require(:person).permit(:foo, :bar, common_params) 
    end 
end 

Concern

module CommonHelper 
    extend ActiveSupport::Concern 

    def common_params 
    { :name, :age, :sex } 
    end 
end 

Idéalement, je devrais obtenir le même résultat que si je faisais: permit(:foo, :bar, :name, :age, :sex).

Répondre

2

Vous pouvez utiliser l'opérateur *, qui divise le tableau dans une liste de paramètres et peut être inclus dans le cadre d'une liste de paramètres existant:

params= ActionController::Parameters.new(person: {foo: 'something', bar: 'something else', name: 'Someone', age: 27, sex: 'M', random: 'not valid'}) 

# however you want to define and include these (method, constant, etc) 
def common_params 
    [:name, :age, :sex] 
end 

params.require(:person).permit(:foo, :bar, *common_params) 
# => <ActionController::Parameters {"foo"=>"something", "bar"=>"something else", "name"=>"Someone", "age"=>27, "sex"=>"M"} permitted: true> 
+0

Apparemment, l'ajout de '* common_params' à la fin n'est pas correct. J'obtiens l'erreur 500 et dans mon journal il indique 'l'erreur de syntaxe, inattendue *, attendant ')''. Cela n'arrive pas si c'est le premier argument de permis. –

+0

Bizarre, avait toutes vos virgules dans une rangée? Je veux dire que ça marche clairement dans l'exemple ici ... le front de liste vs le dos de la liste finit avec la même sortie, c'est juste étrange que ça n'a pas marché pour vous –

+0

Trouvé. J'ai eu un paramètre imbriqué 'foo: [: x,: y,: z]' et en ajoutant '* common_params' après la génération de l'erreur. Tant que c'est avant l'imbriqué c'est bien. Je ne sais pas quel est le problème. –

0

Concern

module CommonHelper 
    COMMON_PARAMS = %i[ name age sex ].freeze 
end 

Contrôleur

def person_params 
    params 
    .require(:person) 
    .permit([:foo, :bar] | CommonHelper::COMMON_PARAMS) 
end