วิธีลบฟิลด์จาก params [: something]


117

แบบฟอร์มการลงทะเบียนของฉันซึ่งเป็นแบบฟอร์มสำหรับโมเดลผู้ใช้ใช้ค่าสตริงสำหรับ บริษัท อย่างไรก็ตามฉันเพิ่งทำการเปลี่ยนแปลงเพื่อให้ผู้ใช้เป็นของ บริษัท ดังนั้นฉันจำเป็นต้องส่งต่อวัตถุของ บริษัท ไปยังรูปแบบผู้ใช้

ฉันต้องการใช้ค่าสตริงจากแบบฟอร์มเพื่อรับวัตถุของ บริษัท :

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

ฉันเชื่อว่าข้างต้นใช้งานได้อย่างไรก็ตามแบบฟอร์มกำลังส่ง: บริษัท (ซึ่งเป็นสตริง) ไปยังโมเดลเมื่อฉันเรียก:

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

ดังนั้นฉันต้องการทราบ (และไม่พบวิธีการ) ในการลบพารามิเตอร์: company ก่อนส่งต่อไปยังโมเดลผู้ใช้

คำตอบ:


210

Rails 4/5 - แก้ไขคำตอบ (ดูความคิดเห็น)

เนื่องจากคำถามนี้ถูกเขียนขึ้น Rails เวอร์ชันใหม่จึงได้เพิ่มสารสกัด! และยกเว้นเช่น:

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

นี่เป็นวิธีที่ปลอดภัยกว่าในการ 'คว้า' พารามิเตอร์ทั้งหมดที่คุณต้องการลงในสำเนาโดยไม่ทำลายต้นฉบับที่ส่งผ่านใน params (ซึ่งไม่ใช่สิ่งที่ดีที่จะทำเพราะจะทำให้การดีบักและการบำรุงรักษาโค้ดของคุณยากมากเมื่อเวลาผ่านไป)

หรือคุณสามารถส่งโดยตรงโดยไม่ต้องคัดลอกเช่น:

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

extract!(มีผู้ประกอบการบาง!) จะปรับเปลี่ยนเดิมเพื่อใช้ด้วยความระมัดระวังมากขึ้น!

คำตอบเดิม

คุณสามารถลบคู่คีย์ / ค่าออกจากแฮชโดยใช้Hash#delete:

params.delete :company

หากมีอยู่ใน params [: user] คุณจะต้องใช้สิ่งนี้:

params[:user].delete :company

16
ฉันใช้ Rails 4.0 และmodel_params.delete :key_nameใช้งานไม่ได้ - มีความคิดอย่างไร
Zorayr

13
การลบออกจากแฮช params เป็นความคิดที่ไม่ดีมาก ความสับสนผู้คนได้อย่างง่ายดายในระหว่างการแก้จุดบกพร่อง ฯลฯ ... assin_params = params.dup.delete(:company)ใช้กัญชากำหนดเองที่คุณส่งผ่านไปยังแอตทริบิวต์ที่กำหนดเช่นการใช้งาน อย่าลบจาก params โดยตรง
Dominik Goltermann

4
ฉันหมายถึงassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann

12
@Zorayr ฉันมีปัญหาเดียวกัน สำหรับฉันมันเป็นเพราะฉันmodel_paramsเป็นฟังก์ชันซึ่งดึงพารามิเตอร์ที่เกี่ยวข้องออกparamsมา ดังนั้นเมื่อคุณdeleteจากmodel_paramsคุณก็แค่ลบออกจากแฮชที่model_paramsส่งคืน
Lucy Bain

1
user_params เป็นวิธีการหนึ่งดังนั้นเมื่อคุณทำ user_params.delete (: this_param) จะคำนวณแฮชที่ถูกต้อง แต่การเรียกใช้ user_params ในภายหลังจะคำนวณค่าแฮชใหม่ตั้งแต่ต้น นี่คือเหตุผลที่ @Gaul กล่าวว่ามันเป็นความคิดที่ไม่ดี ใน Rails 5 ตอนนี้คุณมีเมธอด params.except และแตกไฟล์ด้วย!
rmcsharry

89

คุณน่าจะใช้แฮชยกเว้น

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

ทำได้ 2 สิ่ง: ช่วยให้คุณสามารถยกเว้นมากกว่า 1 คีย์ในแต่ละครั้งและไม่แก้ไขแฮชดั้งเดิม


Rails 4 ActionController :: พารามิเตอร์สืบทอด Hash ดังนั้นยกเว้นหรือแยก! จะใช้งานได้ใน Rails 5 มีข้อยกเว้นและแยก! วิธีการที่กำหนดไว้ใน ActionController :: พารามิเตอร์เอง
kangkyu

ฉันมีพารามิเตอร์แฮชนี้จริงในวิธี UPDATE ฉันจะยกเว้นคนที่มี"-1"กุญแจได้อย่างไร {"utf8" => "✓", "_method" => "patch", "authenticity_token" => "VtY ... ", "โบรชัวร์" => {"title" => "สวัสดีชาวโลก", "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"percent" => "10.0", "description" => "คำอธิบายบางส่วน!", "_destroy" = > "false", "id" => "10"}, "1" => {... }}, "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => { "brochure_id" =>"

2

วิธีที่ถูกต้องในการบรรลุเป้าหมายนี้คือการใช้ 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

วิธีนี้ช่วยให้คุณสามารถควบคุมพารามิเตอร์ที่ควรส่งผ่านไปยังโมเดลได้มากขึ้น


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

สิ่งนี้จะลบพารามิเตอร์ออกจาก url


0

หากต้องการลบคุณสามารถทำบันทึก :

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

ตอนนี้คุณสามารถทำได้:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.