73 votes

Rails 4 Paramètres forts : autoriser tous les attributs ?

Je suis en train de construire une application web avec Rails 4 strong parameters.

Lors de la construction des contrôleurs du back-office admin, je me demande quelle est la meilleure façon d'autoriser tous les attributs du modèle ?

Pour l'instant, j'ai écrit ceci :

def user_params 
  params.require(:user).permit(User.fields.keys)
end

Vous pensez à un meilleur moyen ?

0 votes

Pourquoi ? Je ne fais ce genre de choses que dans mon backoffice d'administration où je fais confiance à tous les utilisateurs.

1 votes

Ce n'est pas parce que vous leur faites confiance (et vous ne devriez pas, mais c'est une autre histoire) que le fait de laisser toutes vos données ouvertes à l'écrasement est une faille de sécurité qui ne demande qu'à être exploitée.

0 votes

Un principe important en matière de sécurité est l'idée de mettre sur liste blanche les éléments que vous souhaitez explicitement rendre disponibles. En établissant une liste explicite, vous évitez des problèmes comme lorsque vous (ou un collègue) introduisez une nouvelle clé dans votre code et que vous vous attendez à ce qu'elle ne soit disponible que par le biais du contrôleur si vous effectuez des actions explicites. En d'autres termes, respectez les conventions, sauf si vous avez une très bonne raison de ne pas le faire. Presque chaque fois que je l'ai fait dans le passé, je me suis tiré dans le pied.

148voto

daemonsy Points 2568

Vous pouvez appeler la version bang du permis.

params.require(:user).permit!

Strong Params README sur Github

Code source pour référence :

def permit!
  each_pair do |key, value|
    convert_hashes_to_parameters(key, value)
    self[key].permit! if self[key].respond_to? :permit!
  end

  @permitted = true
  self
end

7 votes

D'ailleurs, je pense que s'il y avait quelque chose comme permit :all Il me semble qu'il s'agit plus d'une méthode Railish que d'une méthode bang, ce qui signifie généralement que le récepteur a été modifié plus souvent que de marquer une méthode comme dangereuse.

1 votes

Oui mais permit(:all) ressemble à find(:all) d'ActiveRecord qui est déprécié.

1 votes

@NicolasBlanco : Je ne vois pas en quoi c'est un problème que permit(:all) ressemble à find(:all) .

11voto

vvo Points 535

Au cas où quelqu'un en aurait besoin pour Rails 6, sans même un modèle lié à votre contrôleur, vous pouvez utiliser :

before_action :accept_all_params

private

def accept_all_params
  params.permit!
end

Et voilà, maintenant vous pouvez jouer avec autant que vous voulez !

1voto

Anthony Sallows Points 51

La réponse de Skull0inc fonctionne, mais vous pourriez vouloir supprimer created_at y updated_at . L'intention des paramètres forts est de lister seulement les attributs que vous voulez mettre à jour par le contrôleur. Quelque chose comme...

def user_params
  params.require(:user).permit(User.column_names - ["created_at", "updated_at"])
end

0voto

Skull0inc Points 1

Est-ce que ça marcherait ?

def user_params 
  params.require(:user).permit(User.column_names)
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X