Thêm tham số chuỗi truy vấn vào link_to


214

Tôi đang gặp khó khăn khi thêm các tham số chuỗi truy vấn vào link_to UrlHelper. Tôi có chế độ xem Chỉ mục, ví dụ, có các thành phần UI để sắp xếp, lọc và phân trang (thông qua will_paginate). Plugin will_paginate quản lý chính xác các tham số chuỗi truy vấn trong trang.

Có một cơ chế tự động để thêm các tham số chuỗi truy vấn vào một tuyến được đặt tên, hoặc tôi cần phải làm như vậy bằng tay? Rất nhiều nghiên cứu về cấu trúc tưởng chừng đơn giản này đã khiến tôi không biết gì.

Biên tập

Một số thử thách:

  1. Nếu tôi có hai tham số chuỗi truy vấn, nhóm và sắp xếp, làm thế nào để đặt một giá trị cụ thể cho một trong các tham số này trong một link_to, trong khi vẫn giữ giá trị hiện tại của giá trị kia? Ví dụ:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Nếu tôi có nhiều tham số chuỗi truy vấn, nhóm & sắp xếp & page_size và tôi muốn đặt giá trị thành một trong các tham số này, có cách nào để 'tự động' bao gồm tên và giá trị của các tham số còn lại không? Ví dụ:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. Plugin will_paginate tự động quản lý biến trang và các biến chuỗi truy vấn khác. Dường như không có yếu tố UI tự động để quản lý kích thước trang. Mặc dù tôi đã thấy mã để tạo danh sách chọn kích thước trang, tôi muốn có các phần tử A cho phần này (như SO). Một phần của thử thách này có liên quan đến # 2, một phần liên quan đến việc ẩn / hiển thị phần tử UI này dựa trên sự tồn tại / không tồn tại của các bản ghi. Nói cách khác, tôi chỉ muốn bao gồm các liên kết kích thước trang nếu có hồ sơ đến trang. Hơn nữa, tôi thích tự động bao gồm các biến QS khác (ví dụ: trang, nhóm, sắp xếp), thay vì phải bao gồm chúng theo tên trong link_to.



1
liên quan chặt chẽ: stackoverflow.com/questions/2124862/
Mạnh

Câu trả lời:


341

Các tài liệu API trên link_to hiển thị một số ví dụ về việc thêm các truy vấn vào cả hai tuyến được đặt tên và kiểu cũ. Đây có phải là những gì bạn muốn?

link_to cũng có thể tạo liên kết với các neo hoặc chuỗi truy vấn:

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
Câu trả lời của bạn đã giúp tôi giải quyết # 1: <% = link_to "0", profile_path (: xô => '0' ,: sorting => params [: sorting])%>. Cảm ơn.
craig

đúng rồi đó. cú pháp mới là `<% = link_to" Tạo ghi chú ", new_note_path (sender_id: @ user.id)%>`
gsumk

51

Nếu bạn muốn cách nhanh chóng và bẩn thỉu và đừng lo lắng về cuộc tấn công XSS, hãy sử dụng params.mergeđể giữ các tham số trước đó. ví dụ

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

xem: https://stackoverflow.com/a/4174493/445908

Nếu không, hãy kiểm tra câu trả lời này: params.merge và kịch bản chéo trang


56
Đừng làm điều này, nó sẽ mở ra cho bạn các cuộc tấn công xss.
Daniel Nill

1
@ DanielNill- Bạn có thể giải thích
Yarin

3
@Yarin Có một lời giải thích khá hay về câu hỏi này .
James

5
@Yarin Tự ý in các tham số vào trang đã được gửi bởi người dùng (và không nhất thiết phải được làm sạch) cho phép ai đó liên kết đến trang web của bạn bằng một liên kết mã hóa Javascript. Javascript đó sau đó được in vào trang và thực thi, có khả năng đánh cắp cookie hoặc thực hiện các nhiệm vụ bất chính. Rails thường khá giỏi trong việc dọn dẹp những thứ được in trên trang nhưng tốt hơn là an toàn hơn là xin lỗi
Peter Nixey

24

Nếu bạn muốn giữ các thông số hiện có và không để lộ các cuộc tấn công XSS, hãy nhớ xóa sạch các thông số băm, chỉ để lại các thông số mà ứng dụng của bạn có thể gửi:

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

 

Nếu bạn sử dụng nó ở nhiều nơi, hãy làm sạch các thông số trong bộ điều khiển:

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

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

4

Trong trường hợp bạn muốn vượt qua trong một khối, giả sử, đối với nút glyphicon, như sau:

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

Sau đó, việc chuyển các tham số truy vấn có thể được thực hiện thông qua:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.