2010-11-18 30 views
2

コントローラの1つに関する特定のビューがあり、*_pathまたは*_urlを呼び出してパラメータセットを追加したいとします。* _urlまたは* _pathメソッド(Rails)にパラメータを自動的に追加

私はこれをやり直すことができるいくつかの魔法の方法がありますか?私は、Railsのコードで*_pathまたは*_urlのメソッドが処理されているかどうかはわかりません。

わかりやすくするために編集:私はこれを行う方法を探しています。これは、これが発生する必要があるすべてのビューのすべてのリンクを変更する必要はありません。私は、このコーディネーターのビューに触れるすべてのコーダーが、ページに追加するすべてのリンクにパラメーターを追加することを忘れないようにする必要はありません。同じパラメータを自動的に追加する必要があります。私は*_urlまたは*_pathへの変更を失敗と呼びます。同様に、すべての*_urlまたは*_pathコールをオーバーライドする必要があるのは、新しいリンクが追加/削除されるたびに新しいメソッドを追加または削除する必要があるためです。

+0

これを行うことでどのような問題を解決しようとしていますか? – markquezada

+0

Facebook Canvasページでは、ログインしたユーザーに関する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)) %> 

評価。パラメータが一定であれば、eval呼び出しを取り除くことができます。

+0

しかし、私は約20のメソッドを書く必要があります。それぞれのメソッドをページに追加し、新しいURLが参照されるたびに手動でヘルパーを更新します。私はそれを1つの場所で行うことができるものを探していて、ページ上の '* _url' /' * _path'の呼び出しごとに影響を与えます。 –

+0

あなたはどこでもwhatever_pathの代わりにeval(my_path( 'whatever'))を使うだけです。ヘルパーはパス名にパラメータをとりますが、複数のメソッドを書く必要はありません。私はあなたのことを理解していない場合は、説明してください。 –

+0

私は 'eval(my_path(whatever))'が 'my_path(whatever、extra_whatever) 'よりいかに優れているか見ていないと思います...私はすべてのビューのすべてのリンクを編集する必要がない方法を探しています他の誰かが来て、コードベースのビューへのリンクを追加した場合、eval()でラップしたり、手動で余分なパラメータを追加したり、特別なことをしたりする必要はありません。 –

1

with_optionsメソッドを使用できます。あなたの見解では、あなたは何かのようにすることができます

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

    <%= append.users_path(1) %> 

<% end %> 

もちろん、あなたのユーザパスがあるとします。 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 

は、今あなたがする必要があるすべては、すべての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 –

関連する問題