So entfernen Sie ein Feld aus Parametern [: etwas]

116

Mein Registrierungsformular, bei dem es sich um ein Formular für das Benutzermodell handelt, enthält einen Zeichenfolgenwert für das Unternehmen. Ich habe jedoch gerade eine Änderung vorgenommen, sodass Benutzer zu Unternehmen gehören. Daher muss ich ein Objekt der Firma an das Benutzermodell übergeben.

Ich möchte den Zeichenfolgenwert aus dem Formular verwenden, um ein Objekt der Firma zu erhalten:

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

Ich glaube, dass das oben genannte funktioniert, aber das Formular übergibt die Firma: (die Zeichenfolge ist) an das Modell, wenn ich aufrufe:

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

Daher möchte ich wissen (und kann nicht finden, wie), den Parameter: company zu entfernen, bevor er an das Benutzermodell übergeben wird.

Vorsehung
quelle

Antworten:

209

Rails 4/5 - bearbeitete Antwort (siehe Kommentare)

Seit diese Frage geschrieben wurde, haben neuere Versionen von Rails den Auszug hinzugefügt ! und außer zB:

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

Dies ist eine sicherere Methode, um alle benötigten Parameter in eine Kopie zu packen, ohne das in den Parametern übergebene Original zu zerstören (was NICHT gut ist, da dies das Debuggen und die Wartung Ihres Codes im Laufe der Zeit sehr schwierig macht).

Oder Sie können einfach direkt übergeben, ohne zu kopieren, z.

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

Der extract!(hat den! Bang Operator) wird das Original modifizieren, also mit mehr Sorgfalt verwenden!

Ursprüngliche Antwort

Sie können ein Schlüssel / Wert-Paar aus einem Hash entfernen, indem Sie Hash#delete:

params.delete :company

Wenn es in params [: user] enthalten ist, verwenden Sie Folgendes:

params[:user].delete :company
Jeremy Ruten
quelle
16
Ich verwende Rails 4.0 und model_params.delete :key_namefunktioniert nicht - eine Idee warum?
Zorayr
13
Das Löschen aus dem Parameter-Hash ist eine sehr schlechte Idee. verwirrt die Leute leicht beim Debuggen usw. Verwenden Sie einen benutzerdefinierten Hash, den Sie übergeben, um Attribute zuzuweisen, z assin_params = params.dup.delete(:company). B. verwenden . Niemals direkt aus Params löschen
Dominik Goltermann
4
Ich meinteassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann
12
@ Zorayr Ich hatte das gleiche Problem. Für mich war es, weil meine model_paramseine Funktion war, die die relevanten Parameter abzog params. Wenn Sie also deletevon kommen model_params, löschen Sie wirklich nur den zurückgegebenen Hash model_params.
Lucy Bain
1
user_params ist eine Methode. Wenn Sie also user_params.delete (: this_param) ausführen, wird der richtige Hash berechnet, aber jeder nachfolgende Aufruf von user_params berechnet den Hash von Grund auf neu. Deshalb sagte @Gaul, es sei eine schlechte Idee. In Rails 5 haben Sie jetzt die Methode params.except und extrahieren auch!
rmcsharry
89

Sie sollten wahrscheinlich hash.except verwenden

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

Es werden zwei Dinge erreicht: Sie können mehr als einen Schlüssel gleichzeitig ausschließen und den ursprünglichen Hash nicht ändern.

Samuraisam
quelle
Rails 4 ActionController :: Parameter haben Hash geerbt, also ausnehmen oder extrahieren! würde funktionieren, In Rails 5 hat es ausgenommen und extrahiert! Methoden in ActionController :: Parameter selbst definiert
Kangkyu
Ich habe tatsächlich diese Hash-Parameter in der UPDATE-Methode. Wie kann ich diejenigen ausnehmen, die "-1"als Schlüssel haben. {"utf8" => "✓", "_method" => "patch", "authenticity_token" => "VtY ...", "brochure" => {"title" => "Hallo Welt", "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"Prozentsatz" => "10.0", "description" => "Some description!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsors_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => {"brochure_id" => "
2

Der richtige Weg, dies zu erreichen, ist die Verwendung von 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

Auf diese Weise haben Sie mehr Kontrolle darüber, welche Parameter an das Modell übergeben werden sollen

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

Dadurch werden Parameter aus der URL entfernt

Taimoor Changaiz
quelle
0

Um löschen zu können, können Sie ein Memo erstellen :

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

Jetzt können Sie tun:

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