2010-11-18 4 views
2

내 컨트롤러 중 하나와 관련된 특정보기 집합이 있으므로 *_path 또는 *_url에 대한 호출을 통해 매개 변수 집합을 추가 할 수 있습니다.* _url 또는 * _path 메서드 (Rails)에 매개 변수를 자동으로 추가

내가 대신 할 수있는 마법 방법이 있나요? 나는 레일스 코드에서 *_path 또는 *_url 메소드가 처리되는 곳을 모른다.

편의를 위해 편집 :이 작업을 수행해야하는 모든보기에서 모든 링크를 수정할 필요가 없도록이 방법을 찾고 있습니다. 이 뷰 세트를 건드린 모든 코더가 페이지에 추가하는 모든 링크에 매개 변수를 추가해야한다는 점을 기억해야합니다. 동일한 매개 변수가 자동으로 추가되어야합니다. *_url 또는 *_path으로 변경하면 오류가 발생한다고 생각합니다. 마찬가지로 모든 *_url 또는 *_path 호출을 다시 정의해야하는 것은 새로운 링크가 추가/제거 될 때마다 새 메서드를 추가하거나 제거해야하므로 실패로 간주됩니다.

+0

이렇게하면 어떤 문제를 해결하려고합니까? – markquezada

+0

Facebook 캔버스 페이지에서 로그인 된 사용자와 관련된 Facebook 데이터에 API를 통해 액세스 할 수 있도록 모든 "fb_ *"매개 변수를 앱에 나타나는 모든 링크에 추가해야합니다. –

답변

7

덕분에 Samuel's answer 덕분에 아래에 포함 된 새로운 도우미를 통해 최종 작업 솔루션을 만들 수있었습니다.

module ExampleHelper 
    def url_for(options={}) 
    options = case options 
    when String 
     uri = Addressable::URI.new 
     uri.query_values = @hash_of_additional_params 

     options + (options.index('?').nil? ? '?' : '&') + uri.query 
    when Hash 
     options.reverse_merge(@hash_of_additional_params) 
    else 
     options 
    end 

    super 
    end 
end 
0

당신은 도우미 메서드 만들 수 :

def my_path(p) 
    "#{p}_path all the parameters I want to append" 
end 

및 뷰 사용

<%= eval(my_path(whatever)) %> 

평가는 당신에게 동적 범위를 제공과 함께보기에 그렇게 모든 변수를 사용할 수는 도우미에서 사용할 수 있습니다 . 매개 변수가 일정하면 평가 호출을 제거 할 수 있습니다.

+0

그런 다음 페이지에 각각 약 20 개의 메소드를 작성하고 새 URL을 참조 할 때마다 수동으로 도우미를 업데이트해야합니다. 나는 그것을 한 곳에서 할 수있는 무언가를 찾고 있으며 페이지의 모든 * * _url/* * _path 호출에 영향을 미친다. –

+0

당신은 어디서나 whatever_path 대신에 eval (my_path ('whatever'))을 사용합니다. 도우미는 경로 이름에 매개 변수를 사용하며 둘 이상의 메소드를 작성할 필요가 없습니다. 내가 너를 이해하지 못했다면, 설명해주세요. –

+0

나는'eval (my_path (whatever))'이'my_path (whatever, extra_whatever) '보다 낫다는 것을 알지 못한다고 생각합니다 ... 나는 모든보기에서 모든 링크를 편집 할 필요가없는 방법을 찾고 있습니다. 만약 다른 누군가가 코드베이스의 뷰에 대한 링크를 추가하면, eval()에 랩핑하거나 여분의 매개 변수를 수동으로 추가하거나 특별한 것을 수행하는 것을 기억할 필요가 없다. –

1

with_options 메서드를 사용해 볼 수 있습니다. 보기에 당신은 당신이 과정의 users_path이 가정

<% with_options :my_param => "my_value" do |append| -%> 

    <%= append.users_path(1) %> 

<% end %> 

과 같은 작업을 수행 할 수 있습니다. my_param = 값 모든 라우팅 방법은 호출 이후 url_for를 재정 의하여 URL

7

당신은이 작업을 수행 할 수 있습니다에 추가됩니다.

module ApplicationHelper 
    def url_for(options = {}) 
    options.reverse_merge!(@extra_url_for_options) if @extra_url_for_options 
    super 
    end 
end 

지금 당신이 할 필요가 모든 URL을 강제로 해시 @extra_url_for_options을 설정하는 before_filter 사용합니다. 이 여분의 옵션을 사용 모든 링크를 강제하는 것이

class MyController < ApplicationController 
    before_filter do { @extra_url_for_options = { :format => 'html' } } 
end 

참고.

+0

아, 이것이 내가 찾고 있던 것입니다. 나는 어딘가에 마법의 방법이 있어야한다는 것을 알았지 만, 그것이 무엇인지 몰랐다. ApplicationHelper 대신 ControllerSpecificHelper를 사용하여 동일한 작업을 수행 할 수 있다고 가정합니다. –

+0

흠,'options'는 해시가 아니라'* _path' 또는'* _url'을 호출 할 때 문자열이됩니다. 즉,'reverse_merge! '를 호출 할 수 없습니다. 그 문자열에 매개 변수를 추가하고 수퍼를 그렇게 호출 할 수 있다고 생각합니다. 맞습니까? –

+0

도움을 주셔서 감사합니다. 적절한 해결책을 찾았습니다. http://stackoverflow.com/questions/4216906/automatically-append-parameters-to-url-or-path-methods-rails/4228338#4228338 –

관련 문제