126 votes

Comment supprimer un champ de params[:something] ?

Mon formulaire d'inscription, qui est un formulaire pour le modèle Utilisateurs, prend une valeur de type chaîne pour la société. Cependant, je viens d'apporter une modification qui fait que les utilisateurs appartiennent à des sociétés. Par conséquent, je dois transmettre un objet de type Company au modèle Users.

Je veux utiliser la valeur de la chaîne de caractères du formulaire pour obtenir un objet de la société :

@user.company = Company.find_by_name(params[:company])

Je pense que ce qui précède fonctionne, mais le formulaire transmet le paramètre :company (qui est une chaîne) au modèle lorsque je l'appelle :

@user = User.new(params[:user])

Par conséquent, je voudrais savoir (et je ne trouve pas comment) comment supprimer le paramètre :company avant de le transmettre au modèle User.

224voto

Jeremy Ruten Points 59989

Rails 4/5 - réponse éditée (voir les commentaires)

Depuis que cette question a été rédigée, de nouvelles versions de Rails ont ajouté la fonction extrait ! et sauf eg :

new_params = params.except[the one I wish to remove]

C'est un moyen plus sûr de "récupérer" tous les paramètres dont vous avez besoin dans une copie SANS détruire les paramètres originaux transmis (ce qui n'est PAS une bonne chose à faire car cela rendra le débogage et la maintenance de votre code très difficiles au fil du temps).

Ou vous pouvez simplement passer directement sans copier, par exemple :

@person.update(params[:person].except(:admin))

Le site extract! (a l'opérateur ! bang) modifiera l'original donc à utiliser avec plus de précautions !

Réponse originale

Vous pouvez supprimer une paire clé/valeur d'un hachage à l'aide de la fonction Hash#delete :

params.delete :company

S'il est contenu dans params[:user], alors vous utiliserez ceci :

params[:user].delete :company

0 votes

C'est génial, mais devons-nous le faire à l'intérieur du contrôleur ? On dirait que le contrôleur en sait trop sur la vue si on fait ça.

16 votes

J'utilise Rails 4.0, et model_params.delete :key_name ne fonctionne pas - une idée de la raison ?

13 votes

La suppression du hachage des paramètres est une très MAUVAISE IDEE. Cela perturbe facilement les gens pendant le débogage, etc... Utilisez un hachage personnalisé que vous passez pour attribuer des attributs, par exemple utilisez assin_params = params.dup.delete(:company) . ne jamais supprimer directement des paramètres

90voto

samuraisam Points 495

Vous devriez probablement utiliser hash.except

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end

Il accomplit deux choses : il vous permet d'exclure plus d'une clé à la fois, et ne modifie pas le hachage original.

0 votes

Dans Rails 4, ActionController::Parameters a hérité de Hash, donc except ou extract ! fonctionnerait, dans Rails 5, il a sauf et extraire ! les méthodes définies dans ActionController::Parameters lui-même

2voto

Deepak Mahakale Points 13858

La manière correcte d'y parvenir est d'utiliser strong_params

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:name, :age)
  end
end

De cette façon, vous avez plus de contrôle sur les paramètres qui doivent être passés au modèle.

1voto

Taimoor Changaiz Points 892
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

ceci va supprimer les paramètres de l'url

0voto

Pour pouvoir supprimer, vous pouvez faire un mémo :

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

Maintenant vous pouvez le faire :

parameteres.delete(:bar)

parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>

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