2010-11-18 80 views
2

我有一組特定的與我的控制器相關的視圖,因此我想要調用*_path*_url來附加一組參數。自動將參數附加到* _url或* _path方法(Rails)

是否有一些神奇的方法,我可以重寫,會讓我這樣做?我不知道Rails代碼中的哪個方法甚至可以處理*_path*_url方法。

編輯爲清楚起見:我正在尋找一種方法來做到這一點,使我不必修改每個視圖中需要發生這種情況的每個鏈接。我不希望每個接觸這組視圖的編碼人員都必須記住爲每個添加到頁面的鏈接添加一個參數。應自動添加相同的參數。我認爲對*_url*_path的更改稱爲失敗。同樣,必須覆蓋每個*_url*_path調用都被認爲是失敗的,因爲每當添加/刪除新鏈接時都必須添加/刪除新方法。

+0

你試圖通過這樣做來解決什麼問題? – markquezada 2010-11-19 03:19:55

+0

在Facebook畫布頁面上,必須將所有「fb_ *」參數附加到應用中出現的所有鏈接上,以便可以通過其API訪問與登錄用戶有關的Facebook數據。 – 2010-11-21 01:15:55

回答

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)) %> 

評估和演示與給你的動態範圍,所以在你看來每個變量可用可輔助使用。如果你的參數不變,你可以擺脫eval調用。

+0

但是之後我必須編寫大約20個方法,每個頁面都有一個方法,並且每次引用新URL時手動更新助手。我正在尋找一件事,我可以在一個地方做它,並影響頁面上每一個* * _url' /'* _path'調用。 – 2010-11-18 16:37:24

+0

您只需使用eval(my_path('whatever'))而不是whatever_path到處 - 幫助程序將參數傳遞給路徑名,無需編寫多個方法。如果我不理解你,請解釋。 – 2010-11-18 16:40:48

+0

我想我不明白'eval(my_path(whatever))'比'my_path(whatever,extra_whatever)'更好......我正在尋找一種不必編輯每個視圖中的每個鏈接的方法,例如如果有其他人出現並在我們的代碼庫中添加了一個鏈接到視圖,他們不需要記住把它包裝在'eval()'中,手動追加額外的參數或者做其他特別的事情。 – 2010-11-18 16:44:34

1

您可以嘗試使用with_options方法。在你看來,你可以做類似

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

    <%= append.users_path(1) %> 

<% end %> 

假設你有users_path當然。 my_param =值將被追加到url

7

你可以通過覆蓋url_for來做到這一點,因爲所有的路由方法都會調用它。

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

現在,所有你需要做的就是用一個before_filter設置@extra_url_for_options到哈希強制所有URL。

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

注意,這將迫使所有鏈接使用額外的選項。

+0

啊,這就是我正在尋找的。我知道在某個地方必須有一種神奇的方法,但我不知道它是什麼。我假設我可以使用ControllerSpecificHelper而不是ApplicationHelper來做同樣的事情,對嗎? – 2010-11-19 15:46:29

+0

嗯,看起來'options'不是一個散列,而是一個字符串,當我調用'* _path'或'* _url'時,這意味着我無法調用'reverse_merge!'。我想我可以只是將參數附加到該字符串,並以這種方式調用超級,這是否正確? – 2010-11-19 16:00:35

+0

感謝您的幫助,您可以將我引導至正確的解決方案:http://stackoverflow.com/questions/4216906/automatically-append-parameters-to-url-or-path-methods-rails/4228338#4228338 – 2010-11-19 19:03:12

相關問題