Tambahkan parameter querystring ke link_to


214

Saya mengalami kesulitan menambahkan parameter querystring ke link_to UrlHelper. Saya memiliki tampilan Indeks, misalnya, yang memiliki elemen UI untuk menyortir, memfilter, dan pagination (via will_paginate). Plugin will_paginate mengelola persistensi parameter querystring intra-halaman dengan benar.

Apakah ada mekanisme otomatis untuk menambahkan parameter querystring ke rute beri bernama, atau apakah saya perlu melakukannya secara manual? Banyak penelitian tentang konstruksi yang tampaknya sederhana ini membuat saya tidak mengerti.

Edit

Beberapa tantangan:

  1. Jika saya memiliki dua parameter querystring, bucket & sorting, bagaimana cara menetapkan nilai tertentu ke salah satu di link_to, sambil mempertahankan nilai saat ini dari yang lain? Sebagai contoh:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Jika saya memiliki beberapa parameter querystring, bucket & sorting & page_size, dan saya ingin mengatur nilainya ke salah satunya, adakah cara untuk 'secara otomatis' memasukkan nama dan nilai parameter yang tersisa? Sebagai contoh:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. Plugin will_paginate mengelola variabel halamannya dan variabel querystring lainnya secara otomatis. Tampaknya tidak ada elemen UI otomatis untuk mengelola ukuran halaman. Sementara saya telah melihat kode untuk membuat daftar pilih ukuran halaman, saya lebih suka memiliki elemen A untuk ini (seperti SO). Bagian dari tantangan ini terkait dengan # 2, bagian terkait dengan menyembunyikan / menunjukkan elemen UI ini berdasarkan keberadaan / tidak adanya catatan. Dengan kata lain, saya hanya ingin menyertakan tautan ukuran halaman jika ada catatan ke halaman. Selain itu, saya lebih suka memasukkan variabel QS lainnya secara otomatis (yaitu halaman, keranjang, penyortiran), daripada harus memasukkan mereka dengan nama di link_to.



Jawaban:


341

The docs API pada link_to menunjukkan beberapa contoh menambahkan querystrings untuk kedua bernama dan oldstyle rute. Apa ini yang kau inginkan?

link_to juga dapat menghasilkan tautan dengan jangkar atau string kueri:

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
Jawaban Anda membantu saya memecahkan # 1: <% = link_to "0", profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Terima kasih.
craig

ini benar. sintaks baru adalah `<% = link_to" Buat Catatan ", new_note_path (sender_id: @ user.id)%>`
gsumk

51

Jika Anda menginginkan cara cepat dan kotor dan jangan khawatir tentang serangan XSS, gunakan params.mergeuntuk menyimpan parameter sebelumnya. misalnya

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

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

Jika tidak, periksa jawaban ini: params.merge dan skrip lintas situs


56
Jangan lakukan ini, itu membuka Anda hingga serangan xss.
Daniel Nill

1
@ DanielNill- Bisakah Anda jelaskan
Yarin

3
@ Yarin Ada penjelasan yang cukup bagus untuk pertanyaan ini .
James

5
@Yarin Parameter pencetakan sewenang-wenang ke halaman yang telah dikirimkan oleh pengguna (dan belum tentu dibersihkan) memungkinkan seseorang untuk menautkan ke situs Anda dengan tautan yang menyandikan Javascript. Javascript itu kemudian dicetak ke halaman dan dieksekusi, berpotensi mencuri cookie, atau melakukan tugas jahat. Rails biasanya cukup baik dalam membersihkan barang-barang yang dicetak ke dalam halaman tetapi lebih baik aman daripada menyesal
Peter Nixey

24

Jika Anda ingin mempertahankan params yang ada dan tidak membiarkan diri Anda terkena serangan XSS, pastikan untuk membersihkan hash params, hanya menyisakan params yang dapat dikirimkan aplikasi Anda:

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

 

Jika Anda menggunakannya di banyak tempat, bersihkan params di controller:

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

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

4

Jika Anda ingin memberikan blok, katakanlah, untuk tombol glyphicon, seperti berikut ini:

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

Kemudian melewati querystrings params dapat dicapai melalui:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.