2016-10-18 1 views
0

J'ai un code assez fréquent dans notre contrôleur pour gérer des paramètres de liste blanche et désinfectante:Comment `require` paramètres non seulement pour être présent, mais pour être un hachage avec des paramètres de chaîne dans Rails?

def create 
    @sign_in = SignIn.new(sign_in_params) 
    # ... 
end 

def sign_in_params 
    params.require(:user).permit(:email, :password) 
end 

Ceci, cependant, soulève une exception sur les params suivantes:

{ 
    "user": "foobar" 
} 

La raison est que params[:user] est présent , mais qu'il ne retourne pas un autre Hash, mais plutôt une chaîne. Causer une exception: NoMethodError: undefined method permet 'for "foorbar": String`.

Comment puis-je non seulement m'assurer que require nécessite la présence d'un paramètre, mais exige également qu'il soit un hachage? Conformément à la documentation de strong_parameters, il est possible d'appeler les méthodes plusieurs fois.

Répondre

1

donc vous pouvez le faire comme ceci:

# create a strong-parameter for testing 
params = ActionController::Parameters.new({user: {email: "[email protected]"}}) 
# make sure the key is present, raises ActionController::ParameterMissing otherwise 
params.require(:user) 
# make sure the structure is as expected and use the result 
return params.permit(user: [:email]) 
+0

Solution parfaite! Dommage que je perde ainsi la concision du one-liner, mais c'est logique, et c'est un petit compromis. – berkes