2009-02-24 45 views
55

これは愚かな質問かもしれないが、私はパラメータのハッシュを受け入れるルビーメソッドを作成する方法を知らない。パラメータのハッシュを受け入れるrubyメソッドを作成する

login_success :msg => "Success!", :gotourl => user_url 

パラメータのこの種を受け入れるメソッドのプロトタイプがどのようなものです:私はRailsの中で私はこのようなメソッドを使用したいのですが、どういう意味ですか?どのように私はそれらを読むのですか?

答えて

59

パラメタをハッシュ構文でRuby関数に渡すと、Rubyはそれをあなたの目標とみなします。したがって:覚えて

def login_success(hsh = {}) 
    puts hsh[:msg] 
end 
+0

login_success(* params)のようなものを使用できませんか? – collimarco

+5

a *(別名スプラット演算子)は、メソッドが任意の数のargを受け入れ、それらをparamsという配列に配置することを意味します。それを使うかどうかは、あなたが何をしているかによって決まります。あなたが指定した例では、ハッシュが理にかなっています。 – Allyn

+6

それはあなたが何回も議論すると期待していると言います。 'foo(1、:b、 '3')'と似ています。また、その "= {}"の部分は必要ありません。これは正常に動作します:def login_success(hash)。上記のコードはデフォルトを空のハッシュとして設定しています。 –

30

重要なのは、あなただけのハッシュパラメータは、関数の最後のパラメータである場合は、ハッシュ文字{}を省略構文を行うことができるということです。あなたはアランがしたことをすることができ、それはうまくいくでしょう。また

def login_success(name, hsh) 
    puts "User #{name} logged in with #{hsh[:some_hash_key]}" 
end 

そして、あなたは

login_success "username", :time => Time.now, :some_hash_key => "some text" 

でそれを呼び出すことができます。しかし、ハッシュは、最後のパラメータではない場合、あなたは{}でハッシュ要素を囲むように持っています。

5

1つの引数を使用します。 Rubyはハッシュに名前付きの値を変換します:

def login_success arg 
# Your code here 
end 

login_success :msg => 'Success!', :gotourl => user_url 
# => login_success({:msg => 'Success!', :gotourl => user_url}) 

あなたが本当にあなたの代わりに、デフォルトのルビーダックタイピングの、ハッシュを得ることを確認したい場合は、あなたがそれを制御する必要があるだろう。例えば、何かのように、:

def login_success arg 
    raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash 
    # Your code here 
end 
5

キーワード引数の出現により、あなたが今のRuby 2.1では

def login_success(msg:"Default", gotourl:"http://example.com") 
    puts msg 
    redirect_to gotourl 
end 

を行うことができRuby 2.0にあなたが

def login_success(msg:, gotourl:) 
    puts msg 
    redirect_to gotourl 
end 

、デフォルト値を除外することができます呼び出されると、デフォルト値を持たないパラメータを省略すると、ArgumentError

+2

また、Ruby 2.1のデフォルト値を省略して、必要なパラメータを作成することもできます。 'def login_success(msg :, gotourl:)'は、 'msg'と' gotourl'の両方のパラメータが指定されていない状態で 'login_success'を呼び出そうとするとエラーになります。 – Ajedi32

関連する問題