Comment supprimer un champ des paramètres [: quelque chose]

116

Mon formulaire d'inscription, qui est un formulaire pour le modèle Users, prend une valeur de chaîne pour entreprise. Cependant, je viens de faire un changement pour que les utilisateurs appartiennent aux entreprises. Par conséquent, je dois passer un objet Entreprise au modèle Utilisateurs.

Je souhaite utiliser la valeur de chaîne du formulaire pour obtenir l'objet an de Company:

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

Je crois que ce qui précède fonctionne, mais le formulaire passe le: company (qui est une chaîne) dans le modèle lorsque j'appelle:

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

Par conséquent, je veux savoir (et je ne peux pas trouver comment) supprimer le paramètre: company avant de le passer au modèle User.

Providence
la source

Réponses:

209

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

Depuis que cette question a été écrite, de nouvelles versions de Rails ont ajouté l' extrait! et sauf par exemple:

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 l'original passé dans les paramètres (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 extract!(a l'opérateur! Bang) modifiera l'original donc utilisez avec plus de précaution!

Réponse originale

Vous pouvez supprimer une paire clé / valeur d'un hachage en utilisant Hash#delete:

params.delete :company

S'il est contenu dans les paramètres [: user], vous utiliserez ceci:

params[:user].delete :company
Jeremy Ruten
la source
16
J'utilise Rails 4.0 et model_params.delete :key_namene fonctionne pas - aucune idée pourquoi?
Zorayr
13
la suppression du hachage des paramètres est une très mauvaise idée. embrouille facilement les gens lors du 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 des paramètres directement
Dominik Goltermann
4
je voulais direassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann
12
@Zorayr J'ai eu le même problème. Pour moi, c'était parce que ma model_paramsfonction était une fonction, qui tirait les paramètres pertinents params. Alors , quand vous deletede model_paramsvous vraiment juste la suppression du hachage model_paramsrendement.
Lucy Bain
1
user_params est une méthode, donc quand vous faites user_params.delete (: this_param), il calcule le bon hachage, mais tout appel ultérieur à user_params recalculera le hachage à partir de zéro. C'est pourquoi @Gaul a dit que c'était une mauvaise idée. Dans Rails 5, vous avez maintenant la méthode params.except et aussi l'extraction!
rmcsharry
89

Vous devriez probablement utiliser hash.except

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

Il accomplit 2 choses: vous permet d'exclure plus d'une clé à la fois et ne modifie pas le hachage d'origine.

samouraïsam
la source
Rails 4 ActionController :: Paramètres hérités de Hash, donc sauf ou extraire! fonctionnerait, Dans Rails 5, il a sauf et extrait! méthodes définies dans ActionController :: Paramètres lui
kangkyu
J'ai en fait ces paramètres de hachage dans la méthode UPDATE. Comment puis-je exclure ceux qui ont "-1"comme clé. {"utf8" => "✓", "_method" => "patch", "authenticity_token" => "VtY ...", "brochure" => {"title" => "Hello world", "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"pourcentage" => "10.0", "description" => "Une description!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => {"brochure_id" => "
2

La bonne façon 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 à passer au modèle

Deepak Mahakale
la source
1
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

cela supprimera les paramètres de l'URL

Taimoor Changaiz
la source
0

Pour être possible de supprimer, vous pouvez faire un mémo :

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

Maintenant vous pouvez faire:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
Washington Botelho
la source