params Rails อธิบาย?


228

ใครสามารถอธิบายได้paramsในตัวควบคุม Rails: พวกเขามาจากที่ใดและพวกเขากำลังอ้างอิงอะไร

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

ฉันต้องการที่จะสามารถอ่านโค้ดนี้ทีละบรรทัดและเข้าใจสิ่งที่เกิดขึ้น


2
พื้นหลังของคุณในการพัฒนาเว็บฝั่งเซิร์ฟเวอร์คืออะไร? เทคโนโลยีอะไรที่คุณรู้อยู่แล้ว?
Maurício Linhares

3
ฉันใช้ HTML และ CSS มาหลายปีแล้ว ชั้นเรียนที่ใช้ PHP, JS และ Java ใช้ MVC น้อยมากกับ php แม้ว่า ฉันเรียนรู้การเขียนโปรแกรมด้วย Java จริงๆ และฉันเข้าใจทฤษฎีฐานข้อมูลอย่างละเอียด
Dru

คำตอบ:


281

พารามิเตอร์มาจากเบราว์เซอร์ของผู้ใช้เมื่อพวกเขาขอหน้า สำหรับคำขอ HTTP GET ซึ่งเป็นเรื่องที่พบบ่อยที่สุดพารามิเตอร์จะถูกเข้ารหัสใน URL ตัวอย่างเช่นหากเบราว์เซอร์ของผู้ใช้ร้องขอ

http://www.example.com/?foo=1&boo=octopus

จากนั้นparams[:foo]จะเป็น "1" และparams[:boo]จะเป็น "octopus"

ใน HTTP / HTML params เป็นเพียงชุดของคีย์ - ค่าคู่ที่คีย์และค่าเป็นสตริง แต่ Ruby on Rails มีไวยากรณ์พิเศษสำหรับทำให้ params เป็นแฮชที่มีแฮชอยู่ภายใน ตัวอย่างเช่นหากเบราว์เซอร์ของผู้ใช้ร้องขอ

http://www.example.com/?vote[item_id]=1&vote[user_id]=2

จากนั้นparams[:vote]จะเป็นแฮชparams[:vote][:item_id]จะเป็น "1" และparams[:vote][:user_id]จะเป็น "2"

params Ruby on Rails เป็นเทียบเท่าของอาร์เรย์ $ _REQUEST ใน PHP


13
เทียบเท่ากับ $ _REQUEST ยกเว้นว่า $ _REQUEST จะรวมข้อมูลรับโพสต์และคุกกี้ในขณะที่พารามิเตอร์จะรับและส่งข้อมูลเท่านั้น
Parziphal

3
@renocor ข้อมูล POST รวมอยู่ใน Rails paramshash ด้วย ข้อมูลคุกกี้รวมอยู่ในsessionแฮช
Richard Jones

คำตอบนี้ทำให้ไม่มีแหล่งที่มาของพารามิเตอร์อื่น ๆ : URL ดูคำตอบของ hammar สำหรับข้อมูลเพิ่มเติม
Richard Jones

1
toasterlovin ดูเหมือนว่าคุณไม่ได้อ่านประโยคที่สองของคำตอบของฉันหรือดูตัวอย่างแรก
David Grayson

1
@AnkitDhingra ... ฉันคิดว่ามันจะเป็นสตริงเสมอเพราะพารามิเตอร์ HTTP เป็นเพียงคู่คีย์ / ค่าและ Rails (ส่วนใหญ่อาจเป็นอัญมณี Rack) แยกวิเคราะห์เป็นแฮชและอาร์เรย์ตามค่าคีย์ แต่ฉันไม่เห็นอะไรเลยในการจัดเรียง ซึ่งบอก Rails ว่าค่าเป็นตัวเลข
rubyprince

75

ตามที่คนอื่น ๆ ได้ชี้ให้เห็นparamsค่าสามารถมาจากสตริงแบบสอบถามของคำขอ GET หรือข้อมูลแบบฟอร์มของคำขอ POST แต่ยังมีสถานที่ที่สามที่พวกเขาสามารถมาจาก: เส้นทางของ URL

ดังที่คุณอาจทราบแล้ว Rails ใช้สิ่งที่เรียกว่าเส้นทางเพื่อส่งคำขอไปยังการกระทำของคอนโทรลเลอร์ที่เกี่ยวข้อง เส้นทางเหล่านี้อาจมีส่วนที่สกัดจาก URL paramsและใส่ลงไปใน ตัวอย่างเช่นหากคุณมีเส้นทางเช่นนี้:

match 'products/:id', ...

จากนั้นการร้องขอไปยัง URL เช่นที่http://example.com/products/42จะตั้งไปparams[:id]42


คุณจะได้รับพารามิเตอร์ที่สองได้อย่างไร like / หมู่ / id / สมาชิก / id / stuff
weteamsteve

48

พารามิเตอร์ประกอบด้วยพารามิเตอร์สามกลุ่มต่อไปนี้:

  1. ผู้ใช้กำหนดพารามิเตอร์
    • รับ(http://domain.com/url?param1=value1¶m2=value2จะตั้งค่าพารามิเตอร์ [: param1] และ params [: param2])
    • POST (เช่น JSON, XML จะถูกวิเคราะห์โดยอัตโนมัติและเก็บไว้ใน params)
    • หมายเหตุ: โดยค่าเริ่มต้น Rails จะทำซ้ำพารามิเตอร์ผู้ใช้และเก็บไว้ในพารามิเตอร์ [: ผู้ใช้] ถ้าใน UsersController สามารถเปลี่ยนแปลงได้ด้วยการตั้งค่า wrap_parameters
  2. พารามิเตอร์การกำหนดเส้นทาง
    • match '/user/:id' ใน route.rb จะตั้งค่าพารามิเตอร์ [: id]
  3. พารามิเตอร์เริ่มต้น
    • params[:controller]และparams[:action]พร้อมใช้งานเสมอและมีตัวควบคุมและการกระทำปัจจุบัน

1
คุณสามารถขยายบันทึกย่อของคุณภายใต้User supplied parametersอีกเล็กน้อยได้หรือไม่ ตัวอย่างเช่นแฮชของพารามิเตอร์ใน UsersController จะเป็นประโยชน์ ตัวอย่างของคุณทำให้ดูเหมือนแฮชจะดูเหมือน: {first_name: "mike", user: {first_name: "mike"} ...} ถูกต้องหรือไม่
7stud

1
ฉันไม่เห็นว่าใน rails4 {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}ยกตัวอย่างเช่น ยกโทษให้ฉันถ้าฉันผิดฉันเป็นผู้เริ่มต้นทางรถไฟ ตามบันทึกของคุณฉันควรเห็น: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} ฉันไม่รู้ว่าเกี่ยวข้องกับพารามิเตอร์ที่แข็งแกร่งใน rails4 หรือไม่
7stud

2
ฉันเห็น params ที่ซ้ำกันใน Rails 4 แต่ภายใต้คำขอ json POST (โดยใช้ Angularjs) ไม่อยู่ภายใต้โพสต์ HTML ของ Rails ลิงก์นี้จะอธิบายเหตุผล: stackoverflow.com/questions/10774972/…
Homan

13

โดยทั่วไปพารามิเตอร์เป็นข้อมูลที่ผู้ใช้ระบุในแอปพลิเคชันทางรถไฟ

เมื่อคุณโพสต์แบบฟอร์มคุณทำโดยทั่วไปกับคำขอ POST ซึ่งตรงข้ามกับคำขอ GET คุณสามารถคิดคำขอรางปกติเป็นคำขอ GET เมื่อคุณเรียกดูเว็บไซต์ถ้ามันช่วย

เมื่อคุณส่งแบบฟอร์มตัวควบคุมจะถูกส่งกลับไปที่แอปพลิเคชัน คุณจะรับค่าที่คุณส่งไปยังแบบฟอร์มได้อย่างไร paramsฉันแสดง.

เกี่ยวกับรหัสของคุณ @vote = Vote.new params[:vote]สร้าง Vote ใหม่ให้กับฐานข้อมูลโดยใช้ข้อมูลของ params [: vote] กำหนดให้ผู้ใช้แบบฟอร์มของคุณส่งชื่อภายใต้ชื่อ: โหวตข้อมูลทั้งหมดของมันอยู่ในนี้: เขตข้อมูลโหวตของแฮ

สองบรรทัดถัดไปใช้เพื่อรับไอเท็มและผู้ใช้ uid ได้ส่งไปยังแบบฟอร์ม

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

ค้นหาล่าสุดหรือถูกแทรกล่าสุดโหวตจากฐานข้อมูลที่มีเงื่อนไข item_id = item และ user_id = uid

บรรทัดถัดไปใช้เวลาลงคะแนนครั้งสุดท้ายและเวลาปัจจุบัน


6

ทางด้านรางparamsเป็นวิธีการส่งคืนActionController::Parametersวัตถุ ดูhttps://stackoverflow.com/a/44070358/5462485


3
+1 สำหรับการชี้แจงว่าparamsเป็นวิธีการ ทับทิมสามารถทำให้มันเป็นเรื่องยากที่จะแยกแยะความแตกต่างจากวิธีการตัวแปร
samrap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.