Parametrelerden bir alan nasıl kaldırılır [: bir şey]


116

Kullanıcılar modeli için bir form olan kayıt formum, şirket için bir dize değeri alıyor. Ancak, kullanıcıların şirketlere ait olacağı bir değişiklik yaptım. Bu nedenle, Kullanıcılar modeline bir Şirket nesnesi geçirmem gerekiyor.

Şirket nesnesini elde etmek için formdaki dize değerini kullanmak istiyorum:

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

Yukarıdakilerin işe yaradığına inanıyorum, ancak şu aradığımda form: company'yi (string olan) modele geçiriyor:

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

Bu nedenle,: company parametresini Kullanıcı modeline geçirmeden önce kaldıracağımı bilmek istiyorum (ve nasıl yapılacağını bulamıyorum).

Yanıtlar:


209

Rails 4/5 - düzenlenmiş yanıt (yorumlara bakın)

Bu soru yazıldığından beri Rails'in daha yeni sürümleri özü ekledi ! ve hariç örn:

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

Bu, param olarak geçirilen orijinali yok etmeden, ihtiyacınız olan tüm parametreleri bir kopyaya 'kapmanın' daha güvenli bir yoludur (bu, kodunuzun hata ayıklama ve bakımını zaman içinde çok zorlaştıracağı için yapılacak iyi bir şey DEĞİLDİR).

Veya kopyalamadan doğrudan geçebilirsiniz, örneğin:

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

extract!Daha dikkatli kullanılması şekilde orijinali değiştirir (! Patlama operatörü vardır)!

Orijinal Cevap

Aşağıdakileri kullanarak bir Hash'ten anahtar / değer çiftini kaldırabilirsiniz Hash#delete:

params.delete :company

[: User] parametrelerinde yer alıyorsa, bunu kullanırsınız:

params[:user].delete :company

16
Rails 4.0 kullanıyorum ve model_params.delete :key_nameçalışmıyor - neden olduğuna dair bir fikriniz var mı?
Zorayr

13
params hash'inden silmek çok KÖTÜ bir FİKİR. hata ayıklama vb. sırasında insanların kafasını kolayca karıştırır ... öznitelikleri atamak için ilettiğiniz özel bir hash kullanın, örneğin kullanın assin_params = params.dup.delete(:company). asla doğrudan parametrelerden silme
Dominik Goltermann

4
demek assign_params = params.dup; assign_params.delete(:company)
istedim

12
@Zorayr Ben de aynı sorunu yaşadım. Benim için bunun nedeni, benim model_paramsilgili parametreleri çeken bir işlev olmasıydı params. Eğer Yani deletedan model_paramssize gerçekten sadece karma bundan siliyorsunuz model_paramsdöner.
Lucy Bain

1
user_params bir yöntemdir, bu nedenle user_params.delete (: this_param) yaptığınızda, doğru karmayı hesaplar, ancak user_params'a yapılan sonraki herhangi bir çağrı, hash'i sıfırdan yeniden hesaplayacaktır. Bu yüzden @Gaul bunun kötü bir fikir olduğunu söyledi. Rails 5'te artık params.except metodunuz var ve ayrıca extract!
rmcsharry

89

Muhtemelen hash.except kullanmalısınız

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

2 şeyi başarır: bir seferde 1'den fazla anahtarı hariç tutmanıza izin verir ve orijinal karmayı değiştirmez.


Rails 4 ActionController :: Parametreler Hash'i miras aldı, bu yüzden hariç veya ayıkla! işe yarayacaktı, Raylar 5'te, hariç tuttu ve çıkar! ActionController :: Parameters içinde tanımlanan yöntemler
kangkyu

Aslında UPDATE yönteminde bu hash parametrelerine sahibim. "-1"Anahtar olanlardan başka nasıl olabilirim ? {"utf8" => "✓", "_method" => "yama", "Authenticity_token" => "VtY ...", "broşür" => {"title" => "Merhaba dünya", "profilings_attributes" => {"-1" => {"üye_profile_id" => "3"}, "0" => {"yüzde" => "10.0", "açıklama" => "Bazı açıklamalar!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => { "brochure_id" =>"

2

Bunu başarmanın doğru yolu kullanmaktır 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

Bu şekilde, modele hangi parametrelerin geçirilmesi gerektiği konusunda daha fazla kontrole sahip olursunuz


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

bu url'den parametreleri kaldıracak


0

Silmenin mümkün olması için bir not yazabilirsiniz :

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

Şimdi şunları yapabilirsiniz:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.