link_to에 querystring 매개 변수 추가


214

link_to UrlHelper에 querystring 매개 변수를 추가하기가 어렵습니다. 예를 들어 정렬, 필터링 및 페이지 매김을위한 UI 요소가있는 인덱스보기가 있습니다 (will_paginate를 통해). will_paginate 플러그인은 querystring 매개 변수의 페이지 내 지속성을 올바르게 관리합니다.

주어진 이름의 라우트에 querystring 매개 변수를 추가하는 자동 메커니즘이 있습니까? 이 겉보기 간단한 구조에 대한 많은 연구가 저에게 실마리가되었습니다.

편집하다

몇 가지 과제 :

  1. 버킷 및 정렬이라는 두 개의 쿼리 문자열 매개 변수가있는 경우 link_to에서 특정 값을 이들 중 하나에 설정하고 다른 값은 현재 값을 유지하는 방법은 무엇입니까? 예를 들면 다음과 같습니다.

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. 여러 개의 쿼리 문자열 매개 변수, bucket & sorting & page_size가 있고 값을이 중 하나로 설정하려는 경우 나머지 매개 변수의 이름과 값을 '자동으로'포함하는 방법이 있습니까? 예를 들면 다음과 같습니다.

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. will_paginate 플러그인은 페이지 변수 및 기타 쿼리 문자열 변수를 자동으로 관리합니다. 페이지 크기를 관리하기위한 자동 UI 요소가없는 것 같습니다. 페이지 크기의 선택 목록을 작성하는 코드를 보았지만 SO와 같은 A 요소가 있습니다. 이 과제의 일부는 # 2와 관련이 있으며, 일부는 레코드의 존재 여부에 따라이 UI 요소를 숨기거나 표시하는 것과 관련이 있습니다. 다른 방법으로, 페이지에 레코드가있는 경우에만 페이지 크기 링크를 포함하고 싶습니다. 또한 다른 QS 변수 (예 : 페이지, 버킷, 정렬)를 link_to에 이름별로 포함시키지 않고 자동으로 포함하는 것을 선호합니다.



답변:


341

link_toAPI 문서 는 명명 된 경로와 이전 스타일 경로에 쿼리 문자열을 추가하는 몇 가지 예를 보여줍니다. 이것이 당신이 원하는 것입니까?

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, 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 및 cross site scripting


56
이 작업을 수행하지 마십시오. 최대 xss 공격이 가능합니다.
Daniel Nill

1
@ DanielNill- 당신은 설명 할 수 있습니까
Yarin

3
@Yarin 이 질문 에는 꽤 좋은 설명 있습니다.
제임스

5
@Yarin 사용자가 제출 한 페이지에 매개 변수를 임의로 인쇄하면 (청소되지 않아도 됨) 누군가 Javascript를 인코딩하는 링크로 사이트에 링크 할 수 있습니다. 그런 다음 해당 Javascript가 페이지에 인쇄되어 실행되어 쿠키를 훔치거나 사악한 작업을 수행 할 수 있습니다. Rails는 일반적으로 페이지에 인쇄 된 물건을 청소하는 데 능숙하지만 미안한 것보다 안전합니다.
Peter Nixey

24

기존 매개 변수를 유지하고 XSS 공격에 노출되지 않으려면 응용 프로그램에서 보낼 수있는 매개 변수 만 남겨두고 매개 변수 해시를 정리해야합니다.

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

 

여러 곳에서 사용하는 경우 컨트롤러의 매개 변수를 청소하십시오.

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

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

4

예를 들어 다음과 같이 글리프 콘 버튼에 대한 블록을 전달하려는 경우 :

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

그런 다음 쿼리 문자열 매개 변수 전달은 다음을 통해 수행 할 수 있습니다.

<%= 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.