การส่งผ่านพารามิเตอร์ใน Rails redirect_to


202

เราจะส่งพารามิเตอร์ใน redirect_to ไปยังทางรถไฟได้อย่างไร ฉันรู้ว่าเราสามารถส่งผ่าน ID โดยใช้สิ่งนี้:

redirect_to :action => action_name,:id => 3

หากฉันต้องการส่งพารามิเตอร์เพิ่มเติมเช่นข้อมูลในแบบฟอร์มเพื่อให้บรรลุผล

แก้ไข:

สำหรับไวยากรณ์ Ruby 2 คุณต้องอัปเดตข้อมูลโค้ดด้านบนเป็น:

redirect_to action: action_name, id: 3

3
คุณพยายามทำอะไรจริงๆ คุณถือว่าการบันทึกข้อมูลในเซสชั่น?
Michael Sepcot

1
สิ่งที่คุณขอเป็นไปไม่ได้ - หากคุณทำการเปลี่ยนเส้นทางมันจะต้องเป็นคำขอ GET ที่คุณเปลี่ยนเส้นทางดังนั้นผู้ใช้จะมองเห็นพารามิเตอร์ได้เสมอ คุณควรเก็บของไว้ในเซสชั่นแทน
GregT

คำตอบ:


174

เพียงเพิ่มพวกเขาไปยังตัวเลือก:

redirect_to controller: 'thing', action: 'edit', id: 3, something: 'else'

จะให้ผลผลิต /thing/3/edit?something=else


22
คุณไม่สามารถเปลี่ยนเส้นทางด้วย POST จาก HTTP 1.1 เอกสารภายใต้ข้อกำหนด 3xx: "การดำเนินการที่จำเป็นอาจดำเนินการโดยตัวแทนผู้ใช้โดยไม่มีการโต้ตอบกับผู้ใช้ในกรณีที่วิธีที่ใช้ในการร้องขอที่สองคือ GET หรือ HEAD" ขยายสิ่งที่คุณพยายามจะทำให้สำเร็จและเราอาจผลักดันคุณไปในทิศทางที่ถูกต้อง
jdl

สวัสดีขอบคุณมากสำหรับคำตอบของคุณฉันเป็นมือใหม่ในการพัฒนาเว็บไซต์ ฉันพยายามที่จะรู้วิธีที่แตกต่างในการเรียกการกระทำการตอบสนองของคุณได้ชี้แจงข้อสงสัยมากมายของฉัน ขอขอบคุณอีกครั้ง :))
markiv

ยกนิ้ว ฉันได้ค้นหาสิ่งนี้มาตั้งแต่ 1 ชั่วโมง

86

หากคุณกำลังใช้ทรัพยากร RESTful คุณสามารถทำสิ่งต่อไปนี้:

redirect_to action_name_resource_path(resource_object, param_1: 'value_1', param_2: 'value_2')

or
#You can also use the object_id instead of the object
redirect_to action_name_resource_path(resource_object_id, param_1: 'value_1', param_2: 'value_2')

or
#if its a collection action like index, you can omit the id as follows
redirect_to action_name_resource_path(param_1: 'value_1', param_2: 'value_2')

#An example with nested resource is as follows:
redirect_to edit_user_project_path(@user, @project, param_1: 'value_1', param_2: 'value_2')

46

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

redirect_to act_house_path(request.parameters)


1
คุณรู้หรือไม่ว่าคุณจะรวมสิ่งนี้บวกกับพารามิเตอร์ใหม่ได้อย่างไร เช่น request.parameters, (หรือ +): this =>: that
Chris Edwards

5
คุณสามารถใช้วิธีการผสาน ตัวอย่างเช่น:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT

3
นอกจากนี้คุณยังสามารถใช้วิธียกเว้นเพื่อแยกพารามิเตอร์ที่ไม่ต้องการหลังจากรวม:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
mr io

39

คุณสามารถส่งวัตถุใด ๆ ไปยังเทมเพลตด้วยพารามิเตอร์แฟลช

 redirect_to :back, flash: {new_solution_errors: solution.errors}

จากนั้นเข้าใช้เทมเพลตผ่านแฮช

<% flash[:new_solution_errors].each do |err| %>

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


7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id

6
คุณช่วยอธิบายเพิ่มเติมได้ไหม ตัวอย่างรหัสไม่เพียงพอจริง ๆ
simonmenke

7

หากคุณกำลังมองหาวิธีส่งพารามิเตอร์ URL เพิ่มเติม (ไม่ใช่คอนโทรลเลอร์, แอ็คชัน, id และอื่น ๆ ) นี่เป็นวิธีที่มีประสิทธิภาพสำหรับการทำเช่นนี้:

object_path(@object, params: request.query_parameters)

สิ่งนี้จะผ่านพารามิเตอร์ utmหรือพารามิเตอร์เพิ่มเติมอื่น ๆ ที่คุณไม่ต้องการเสีย


4

routes.rb

 match 'controller_name/action_name' => 'controller_name#action_name', via: [:get, :post], :as => :abc

ตัวควบคุมใด ๆ ที่คุณต้องการเปลี่ยนเส้นทางพร้อมพารามิเตอร์ให้ไว้ด้านล่าง:

redirect_to abc_path(@abc, id: @id), :notice => "message fine" 

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