เพิ่มพารามิเตอร์การสืบค้นลงใน link_to


214

ฉันกำลังเพิ่มพารามิเตอร์การสืบค้นอย่างหนักไปยัง link_to UrlHelper ฉันมีมุมมองดัชนีเช่นที่มีองค์ประกอบ UI สำหรับการเรียงลำดับการกรองและการแบ่งหน้า (ผ่าน will_paginate) ปลั๊กอิน will_paginate จัดการการคงอยู่ภายในหน้าของพารามิเตอร์การสืบค้นอย่างถูกต้อง

มีกลไกอัตโนมัติในการเพิ่มพารามิเตอร์การสืบค้นไปยังเส้นทางที่กำหนดชื่อหรือฉันต้องทำด้วยตนเอง? การวิจัยจำนวนมากเกี่ยวกับโครงสร้างที่ดูเรียบง่ายนี้ทำให้ฉันไร้ความรู้สึก

แก้ไข

ความท้าทายบางประการ:

  1. หากฉันมีสองพารามิเตอร์การสืบค้นฝากข้อมูล & การเรียงลำดับจะกำหนดค่าเฉพาะเป็นหนึ่งในพารามิเตอร์เหล่านี้ใน link_to ได้อย่างไรในขณะที่รักษามูลค่าปัจจุบันของอีกพารามิเตอร์ไว้ ตัวอย่างเช่น:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. หากฉันมีพารามิเตอร์การสืบค้นหลายอันการฝากข้อมูล & การเรียง & page_size และฉันต้องการตั้งค่าเป็นหนึ่งในนั้นมีวิธีการ 'อัตโนมัติ' รวมชื่อและค่าของพารามิเตอร์ที่เหลืออยู่หรือไม่ ตัวอย่างเช่น:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. ปลั๊กอิน will_paginate จัดการตัวแปรของหน้าและตัวแปรการสืบค้นอื่น ๆ โดยอัตโนมัติ ดูเหมือนจะไม่มีองค์ประกอบ UI อัตโนมัติสำหรับการจัดการขนาดหน้า ในขณะที่ฉันเห็นรหัสเพื่อสร้างรายการขนาดหน้ากระดาษที่เลือก แต่ฉันต้องการมีองค์ประกอบสำหรับสิ่งนี้ (เช่น SO) ส่วนหนึ่งของความท้าทายนี้เกี่ยวข้องกับ # 2 ส่วนเกี่ยวข้องกับการซ่อน / แสดงองค์ประกอบ UI นี้ตามการมีอยู่ / ไม่มีอยู่ของระเบียน กล่าวอีกวิธีหนึ่งฉันต้องการรวมลิงค์ขนาดหน้าถ้ามีการบันทึกไปยังหน้า นอกจากนี้ฉันต้องการรวมตัวแปร QS อื่น ๆ โดยอัตโนมัติ (เช่นหน้าเว็บฝากข้อมูลการเรียงลำดับ) แทนที่จะรวมไว้ในชื่อใน link_to



1
เกี่ยวข้องอย่างใกล้ชิด: stackoverflow.com/questions/2124862/…
Ciro Santilli 法轮功冠状病病六四事件法轮功

คำตอบ:


341

เอกสาร API บน LINK_TOแสดงตัวอย่างบางส่วนของการเพิ่ม querystrings ทั้งเส้นทางและชื่อ OldStyle นี่คือสิ่งที่คุณต้องการ?

link_to ยังสามารถสร้างลิงก์ด้วยจุดยึดหรือสตริงการสืบค้น:

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
#=> <a href="https://stackoverflow.com/profiles/1#wall">Comment wall</a>

link_to "Ruby on Rails search", :controller => "searches", :query => "ruby on rails"
#=> <a href="https://stackoverflow.com/searches?query=ruby+on+rails">Ruby on Rails search</a>

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
#=> <a href="https://stackoverflow.com/searches?foo=bar&amp;baz=quux">Nonsense search</a>

1
คำตอบของคุณช่วยฉันแก้ปัญหา # 1: <% = link_to "0", profiles_path (: bucket => '0',: sorting => params [: sorting])%> ขอบคุณ
craig

ถูกต้องแล้ว ไวยากรณ์ใหม่คือ `<% = link_to" Create Note ", new_note_path (sender_id: @ user.id)%>`
gsumk

51

หากคุณต้องการวิธีที่รวดเร็วและสกปรกและไม่ต้องกังวลกับการโจมตี XSS ใช้params.mergeเพื่อเก็บพารามิเตอร์ก่อนหน้า เช่น

<%= link_to 'Link', params.merge({:per_page => 20}) %>

ดู: https://stackoverflow.com/a/4174493/445908

มิฉะนั้นให้ตรวจสอบคำตอบนี้: params.merge และการเขียนสคริปต์ข้ามไซต์


56
อย่าทำเช่นนี้มันจะเปิดการโจมตี xss ให้คุณ
Daniel Nill

1
@ DanielNill- คุณช่วยอธิบายได้
ไหม

3
@Yarin มีคำอธิบายที่ดีสำหรับคำถามนี้
James

5
@Yarin การพิมพ์พารามิเตอร์โดยพลการลงในหน้าเว็บที่ผู้ใช้ส่งมา (และไม่จำเป็นต้องทำความสะอาด) จะอนุญาตให้บางคนเชื่อมโยงไปยังเว็บไซต์ของคุณพร้อมลิงก์ที่เข้ารหัสจาวาสคริปต์ จากนั้น Javascript นั้นจะถูกพิมพ์ลงในหน้าเว็บและดำเนินการซึ่งอาจขโมยคุกกี้หรือทำงานที่เลวร้าย โดยปกติ Rails นั้นค่อนข้างดีในการทำความสะอาดสิ่งต่าง ๆ ที่พิมพ์ไว้ในหน้ากระดาษ แต่ควรปลอดภัยกว่าขออภัย
Peter Nixey

24

หากคุณต้องการเก็บ params ที่มีอยู่และไม่เปิดเผยการโจมตี XSS ให้แน่ใจว่าได้ล้างแฮช params ให้เหลือเฉพาะ params ที่แอปของคุณสามารถส่งได้:

# inline
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %>

 

หากคุณใช้มันในหลาย ๆ ที่ให้ทำความสะอาด params ในคอนโทรลเลอร์:

# your_controller.rb
@params = params.slice(:sort, :per_page)

# view
<%= link_to 'Link', @params.merge(per_page: 20) %>

4

ในกรณีที่คุณต้องการผ่านบล็อกให้พูดสำหรับปุ่ม glyphicon ดังต่อไปนี้:

<%= link_to my_url, class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>

จากนั้นก็สามารถทำได้สำเร็จผ่าน parer querystrings:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.