Jak usunąć pole z params [: something]


116

Mój formularz rejestracyjny, który jest formularzem dla modelu Users, przyjmuje wartość ciągu dla firmy. Jednak właśnie dokonałem takiej zmiany, że użytkownicy należą do firm. Dlatego muszę przekazać obiekt firmy do modelu Users.

Chcę użyć wartości ciągu z formularza, aby uzyskać obiekt firmy:

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

Wydaje mi się, że powyższe działa, jednak forma przekazuje: firmę (czyli ciąg znaków) do modelu, gdy dzwonię:

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

Dlatego chcę wiedzieć (i nie mogę znaleźć sposobu), aby usunąć parametr: company przed przekazaniem go do modelu użytkownika.

Odpowiedzi:


209

Rails 4/5 - zredagowana odpowiedź (patrz komentarze)

Odkąd to pytanie zostało napisane, nowsze wersje Railsów dodały wyciąg! i za wyjątkiem np .:

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

Jest to bezpieczniejszy sposób na „przechwycenie” wszystkich potrzebnych parametrów do kopii BEZ niszczenia oryginału przekazanego w parametrach (co NIE jest dobrą rzeczą, ponieważ utrudni debugowanie i konserwację kodu).

Lub możesz po prostu przejść bezpośrednio bez kopiowania, np:

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

Operator extract!(ma! Bang) zmodyfikuje oryginał, więc używaj go z większą ostrożnością!

Oryginalna odpowiedź

Możesz usunąć parę klucz / wartość z skrótu za pomocą Hash#delete:

params.delete :company

Jeśli jest zawarty w params [: user], użyjesz tego:

params[:user].delete :company

16
Używam Rails 4.0 i model_params.delete :key_namenie działa - nie wiadomo dlaczego?
Zorayr

13
usuwanie z hasha params to bardzo ZŁY POMYSŁ. łatwo dezorientuje ludzi podczas debugowania itp. ... użyj niestandardowego skrótu, który przekazujesz, aby przypisać atrybuty, np assin_params = params.dup.delete(:company). use . nigdy nie usuwaj bezpośrednio z parametrów
Dominik Goltermann

4
assign_params = params.dup; assign_params.delete(:company)
miałem na

12
@Zorayr Miałem ten sam problem. Dla mnie to dlatego, że moja model_paramsbyła funkcją, która wyciągnęła odpowiednie parametry z params. Więc kiedy jesteś deletez model_paramsnaprawdę po prostu usuwasz z haszu, który model_paramspowraca.
Lucy Bain

1
user_params to metoda, więc kiedy robisz user_params.delete (: this_param), oblicza on właściwy hash, ale każde kolejne wywołanie user_params będzie obliczało hash od zera. Dlatego @Gaul powiedział, że to zły pomysł. W Rails 5 masz teraz metodę params.except, a także wypakuj!
rmcsharry

89

Prawdopodobnie powinieneś używać hash.except

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

Realizuje 2 rzeczy: pozwala wykluczyć więcej niż 1 klucz na raz i nie modyfikuje oryginalnego skrótu.


Rails 4 ActionController :: Parametry dziedziczone Hash, więc oprócz lub wyodrębnij! zadziała, w Railsach 5 ma wyjątek i wyodrębnianie! metody zdefiniowane w ActionController :: Parameters same w sobie
kangkyu

Właściwie mam te parametry skrótu w metodzie UPDATE. Jak mogę oprócz tych, którzy mają "-1"za klucz. {"utf8" => "✓", "_method" => "patch", "autentyczność_token" => "VtY ...", "brochure" => {"title" => "Witaj świecie", "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"percent" => "10,0", "description" => "Jakiś opis!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => {"brochure_id" => "

2

Prawidłowym sposobem osiągnięcia tego jest użycie 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

W ten sposób masz większą kontrolę nad tym, które parametry powinny zostać przekazane do modelu


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

spowoduje to usunięcie parametrów z adresu URL


0

Aby móc usunąć, możesz zrobić notatkę :

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

Teraz możesz:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.