Come rimuovere un campo da params [: something]


116

Il mio modulo di registrazione, che è un modulo per il modello Utenti, assume un valore stringa per azienda. Tuttavia, ho appena apportato una modifica in modo tale che gli utenti appartengano alle aziende. Pertanto, ho bisogno di passare un oggetto di Company al modello Users.

Voglio utilizzare il valore della stringa dal modulo per ottenere l'oggetto an di Company:

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

Credo che quanto sopra funzioni, tuttavia il modulo passa la: company (che è una stringa) nel modello quando chiamo:

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

Pertanto, voglio sapere (e non riesco a trovare come) rimuovere il parametro: company prima di passarlo al modello utente.

Risposte:


209

Rails 4/5 - risposta modificata (vedi commenti)

Poiché questa domanda è stata scritta, le versioni più recenti di Rails hanno aggiunto l' estratto! e tranne ad esempio:

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

Questo è un modo più sicuro per "afferrare" tutti i parametri di cui hai bisogno in una copia SENZA distruggere l'originale passato in params (il che NON è una buona cosa da fare in quanto renderà il debug e la manutenzione del codice molto difficile nel tempo).

Oppure potresti semplicemente passare direttamente senza copiare ad esempio:

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

L' extract!(ha la! Dell'operatore botto) modificherà l'originale in modo utilizzare con più cura!

Risposta originale

Puoi rimuovere una coppia chiave / valore da un hash utilizzando Hash#delete:

params.delete :company

Se è contenuto in params [: user], dovresti utilizzare questo:

params[:user].delete :company

16
Sto usando Rails 4.0 e model_params.delete :key_namenon funziona - hai idea del perché?
Zorayr

13
l'eliminazione dall'hash dei parametri è un'IDEA molto CATTIVA. confonde facilmente le persone durante il debug ecc ... usa un hash personalizzato che passi per assegnare attributi, ad esempio use assin_params = params.dup.delete(:company). non cancellare mai direttamente dai parametri
Dominik Goltermann

4
volevo direassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann

12
@Zorayr Ho avuto lo stesso problema. Per me era perché la mia model_paramsera una funzione, che estraeva i parametri rilevanti da params. Quindi quando vieni deleteda model_paramste stai solo cancellando dall'hash che model_paramsritorna.
Lucy Bain

1
user_params è un metodo, quindi quando esegui user_params.delete (: this_param), calcola l'hash corretto, ma qualsiasi chiamata successiva a user_params ricalcola l'hash da zero. Questo è il motivo per cui @Gaul ha detto che è una cattiva idea. In Rails 5 ora hai params.except metodo e anche l'estrazione!
rmcsharry,

89

Probabilmente dovresti usare hash.except

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

Compie 2 cose: consente di escludere più di 1 chiave alla volta e non modifica l'hash originale.


Rails 4 ActionController :: I parametri hanno ereditato Hash, quindi eccetto o estrai! funzionerebbe, in Rails 5, ha l' eccezione e l'estrazione! metodi definiti in ActionController :: Parameters stesso
kangkyu

In realtà ho questi parametri hash nel metodo UPDATE. Come posso eccetto quelli che hanno "-1"come chiave. {"utf8" => "✓", "_method" => "patch", "authenticity_token" => "VtY ...", "brochure" => {"title" => "Hello world", "profiling_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"percent" => "10.0", "description" => "Some description!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => { "brochure_id" =>"

2

Il modo corretto per ottenere ciò è usare 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

In questo modo hai più controllo su quali parametri devono essere passati al modello


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

questo rimuoverà i parametri dall'URL


0

Per essere possibile eliminare puoi fare un memo :

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

Ora puoi fare:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.