Cara menghapus bidang dari params [: sesuatu]

116

Formulir pendaftaran saya, yang merupakan formulir untuk model Pengguna, mengambil nilai string untuk perusahaan. Namun, saya baru saja membuat perubahan sehingga pengguna menjadi milik perusahaan. Oleh karena itu, saya perlu meneruskan objek Perusahaan ke model Pengguna.

Saya ingin menggunakan nilai string dari formulir untuk mendapatkan objek Perusahaan:

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

Saya yakin cara di atas berfungsi, namun formulirnya meneruskan: perusahaan (yang merupakan string) ke dalam model ketika saya memanggil:

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

Oleh karena itu, saya ingin tahu (dan tidak dapat menemukan cara) untuk menghapus: parameter perusahaan sebelum meneruskannya ke model Pengguna.

penyediaan
sumber

Jawaban:

209

Rails 4/5 - jawaban yang diedit (lihat komentar)

Sejak pertanyaan ini ditulis, versi Rails yang lebih baru telah menambahkan ekstrak! dan kecuali misalnya:

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

Ini adalah cara yang lebih aman untuk 'mengambil' semua params yang Anda butuhkan ke dalam salinan TANPA menghancurkan yang asli yang diteruskan di params (yang BUKAN merupakan hal yang baik untuk dilakukan karena akan membuat debugging dan pemeliharaan kode Anda sangat sulit dari waktu ke waktu).

Atau Anda bisa langsung lulus tanpa menyalin misalnya:

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

The extract!(memiliki operator Bang!) Akan memodifikasi aslinya sehingga digunakan dengan lebih hati-hati!

Jawaban Asli

Anda dapat menghapus pasangan kunci / nilai dari Hash menggunakan Hash#delete:

params.delete :company

Jika ada di params [: user], maka Anda akan menggunakan ini:

params[:user].delete :company
Jeremy Ruten
sumber
16
Saya menggunakan Rails 4.0, dan model_params.delete :key_nametidak berfungsi - tahu mengapa?
Zorayr
13
menghapus dari hash params adalah IDE yang sangat BURUK. membingungkan orang dengan mudah selama debugging dll ... gunakan hash khusus yang Anda berikan untuk menetapkan atribut, misalnya gunakan assin_params = params.dup.delete(:company). tidak pernah menghapus dari params secara langsung
Dominik Goltermann
4
maksud sayaassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann
12
@Zorayr Saya memiliki masalah yang sama. Bagi saya itu karena saya model_paramsadalah fungsi, yang menarik parameter yang relevan dari params. Jadi ketika Anda deletedari model_paramsAnda benar-benar hanya menghapus dari hash yang model_paramskembali.
Lucy Bain
1
user_params adalah sebuah metode, jadi ketika Anda melakukan user_params.delete (: this_param), ini menghitung hash yang benar, tetapi panggilan berikutnya ke user_params akan menghitung ulang hash dari awal. Inilah mengapa @Gaul mengatakan itu ide yang buruk. Di Rails 5 Anda sekarang memiliki metode params.except dan juga ekstrak!
rmcsharry
89

Anda mungkin harus menggunakan hash.except

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

Ini menyelesaikan 2 hal: memungkinkan Anda mengecualikan lebih dari 1 kunci sekaligus, dan tidak mengubah hash asli.

samuraisam
sumber
Rails 4 ActionController :: Parameters mewarisi Hash, jadi kecuali atau ekstrak! akan bekerja, Di Rails 5, ia memiliki kecuali dan mengekstrak! metode yang ditentukan dalam ActionController :: Parameters sendiri
kangkyu
Saya sebenarnya memiliki parameter hash ini dalam metode UPDATE. Bagaimana saya bisa kecuali orang-orang yang memiliki "-1"sebagai kuncinya. {"utf8" => "✓", "_method" => "patch", "authenticity_token" => "VtY ...", "brochure" => {"title" => "Hello world", "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"persentase" => "10.0", "description" => "Beberapa deskripsi!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => {"brochure_id" => "
2

Cara yang benar untuk mencapai ini adalah dengan menggunakan 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

Dengan cara ini Anda memiliki kontrol lebih terhadap parameter mana yang harus diteruskan ke model

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

ini akan menghapus params dari url

Taimoor Changaiz
sumber
0

Agar bisa menghapus Anda bisa melakukan memo :

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

Sekarang Anda dapat melakukan:

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