2011-07-08 3 views
2

多くのRailsヘルパは、最後の引数として慣用的なオプションのハッシュを使用します。 Rubyは追加のメソッド引数をそのハッシュに自動的に挿入します。私はしばしば、条件付きで要素を挿入したい、あるいはその要素を提供するヘルパーを記述したいと思っています。擬似Rubyで二つの例:Rubyの最後の引数のマジックハッシュにリテラルでないハッシュ要素を追加しますか?

link_to "Example 1", "http://www.example.com", needs_confirmation? ? :confirm => "Are you sure?" : nil # syntax error; nil can't be a hash element 

または

link_to "Example 2", "http://www.example.com", unique_link_id 

# I don't want to return a hash; I want to return an element of a hash 
def unique_link_id 
    :id => "our_link_#{user.id}" # Syntax error 
    {:id => "our_link_#{user.id}"} # valid, but returns a hash that ends up being an element of the options hash 
    {:id => "our_link_#{user.id}"}.flatten_into_my_parent_hash # What's in my brain 
end 

これを行うには、いくつかのエレガントな方法はありますか?明らかにRailsヘルパーを制御することはできませんので、ハッシュを平らにすることはできません。 (Hash#flattenメソッドがあるわけではありませんが、たとえあったとしても)

私は、メソッド呼び出しの前に変数としてハッシュを構築できますが、オプションで要素を追加することもできますが、... ick。

これらは人為的な例であり、ヘルパーは:confirm => nilまたは:id => nilを許可しないとし、そのunique_link_idはIDを残しておきたいとします。私は、Railsの問題を解決するよりもハッシュ構文に興味があります。

誰でも?

link_to "Example 1", "http://www.example.com", :confirm => needs_confirmation? ? "Are you sure?" : nil 

と第2ケースのためにあなたが同様に、次の言うことができる:

link_to "Example 2", "http://www.example.com", :id=>unique_link_id 

注:unique_link_idは(文字列を返すべき

答えて

2

は、私はあなたが以下のような何かをしようとすべきだと思いますあなたがIDを持ってほしくない場合は無し)

あなたの質問に一般的に答えるには、あなたがメソッドで渡すこれらのパラメータをどのように扱うかを理解する必要があります(例えば、ああエルフ)。

ほとんどのレールヘルパーは次のように起動します。あなたは上記の知っておくべき

def a_helper(*args) 
    options = args.extract_options! 
    ... 
end 

何を:配列がパラメータとして渡されることが想定されます。あなたが追加する:something =>の値はすべて、この配列の最後の要素であるハッシュに変換されます。したがって、extract_options!は、通常のパラメータとハッシュオプションを区切ります。だからあなたが働きたいものを注文するには、すべてのオプションはになります。最後にハッシュです。ハッシュを返し、他のオプションとマージされunique_link_idこの場合

link_to "Example 1", "http://www.example.com",{:confirm=>"Are you sure?"}.merge(unique_link_id) 

:ソートここで長い話をするために

は、あなたが何をすべきかの一例です。 unique_link_idが空のハッシュ({})を返す場合、オプションは何も追加されず、誰もが幸せです:)

オプションが複雑すぎる場合は、希望のヘルパーを呼び出す前にオプション変数を作成することをお勧めします。 optionsは、メソッドに最後のパラメータとして渡す前に、他のハッシュと何回もマージしたハッシュにする必要があります。

ヒント:非常に便利なハッシュ関数は、hash.merge()、hash.merge!()、hashです。reverse_merge()

+0

ありがとうございました。これは、これらの特定の問題を解決しますが、全体的な問題は解決しません。私が探しているものを明確にするために質問を編集しました。 –

+0

あなたはそれを編集したとは思いませんでした。はい、答えの第2部はまさに私が望んでいたものです - {} .mergeは私だけではありません:id => unique_link_id、しかし独自のunique_link_id。完璧。 –

関連する問題