Link_to'ya sorgu dizesi parametreleri ekle


214

Link_to UrlHelper için zor sorgu dizesi parametreleri ekliyorum. Örneğin, sıralama, filtreleme ve sayfalama (will_paginate aracılığıyla) için UI öğeleri olan bir dizin görünümü var. Will_paginate eklentisi, sorgu dizesi parametrelerinin sayfa içi kalıcılığını doğru bir şekilde yönetir.

Querystring parametrelerini adlandırılmış bir yola eklemek için otomatik bir mekanizma var mı, yoksa bunu manuel olarak yapmam gerekiyor mu? Görünüşte basit olan bu yapı üzerine yapılan büyük araştırmalar beni cüretsiz bıraktı.

Düzenle

Zorluklardan bazıları:

  1. İki sorgu dizesi parametresim varsa, grupla ve sırala, bir diğerinin geçerli değerini korurken nasıl link_to içinde bunlardan birine belirli bir değeri nasıl ayarlayabilirim? Örneğin:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Birden fazla sorgu dizesi parametresi, kova & sıralama & sayfa_boyutum varsa ve değeri bunlardan birine ayarlamak istiyorsanız, 'otomatik olarak' kalan parametrelerin adlarını ve değerlerini dahil etmenin bir yolu var mı? Örneğin:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. Will_paginate eklentisi sayfa değişkenini ve diğer sorgu dizesi değişkenlerini otomatik olarak yönetir. Sayfa boyutunu yönetmek için otomatik bir kullanıcı arayüzü öğesi yok gibi görünüyor. Sayfa boyutları seçme listesi oluşturmak için kod gördüm, ancak bunun için (SO gibi) A öğeleri olurdu. Bu zorluğun bir kısmı # 2 ile ilgilidir, bir kısmı da kayıtların varlığına / yokluğuna bağlı olarak bu UI öğesini gizlemek / göstermekle ilgilidir. Başka bir deyişle, sadece sayfaya kayıt varsa sayfa boyutu bağlantıları dahil etmek istiyorum. Dahası, otomatik olarak diğer QS değişkenlerini (yani sayfa, bölüm, sıralama), link_to'ya ada göre eklemek zorunda kalmayı tercih ederim.



Yanıtlar:


341

Link_to üzerinde API dosyaları hem adlandırılmış ve oldstyle yolları querystrings ekleyerek bazı örneklerini göstermektedir. İstediğiniz bu mu?

link_to bağlantı veya sorgu dizeleriyle bağlantılar da oluşturabilir:

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
Cevabınız # 1'i çözmeme yardımcı oldu: <% = link_to "0", profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Teşekkürler.
craig

bu doğru. yeni sözdizimi "<% = link_to" Not Oluştur ", new_note_path (sender_id: @ user.id)%>`
gsumk

51

Hızlı ve kirli bir yol istiyorsanız ve XSS saldırısı hakkında endişelenmiyorsanız, params.mergeönceki parametreleri korumak için kullanın . Örneğin

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

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

Aksi takdirde şu yanıtı kontrol edin: params.merge ve siteler arası komut dosyası oluşturma


56
Bunu yapmayın, sizi xss saldırılarına kadar açar.
Daniel Nill

1
@ DanielNill- Açıklayabilir misiniz
Yarin

3
@Yarin Bu soruda oldukça iyi bir açıklama var .
James

5
@Yarin Parametreleri, kullanıcı tarafından gönderilen (ve mutlaka temizlenmesi gerekmeyen) isteğe bağlı olarak sayfalara yazdırmak, birisinin sitenize Javascript kodlayan bir bağlantıyla bağlanmasına izin verir. Bu Javascript daha sonra sayfaya yazdırılır ve yürütülür, potansiyel olarak çerezleri çalar veya hain görevler yapar. Rails normalde sayfaya yazdırılan şeyleri temizlemekte oldukça iyidir, ancak
üzülmektense

24

Mevcut parametreleri korumak ve kendinizi XSS saldırılarına maruz bırakmak istemiyorsanız, yalnızca uygulamanızın gönderebileceği parametreleri bırakarak params karmasını temizlediğinizden emin olun:

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

 

Birden fazla yerde kullanıyorsanız, denetleyicideki parametreleri temizleyin:

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

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

4

Aşağıdaki gibi, bir glifik düğmesi için bir bloktan geçmek istediğinizde:

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

Daha sonra querystrings parametrelerini iletmek şu yollarla gerçekleştirilebilir:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.