2011-08-04 7 views
1

何らかの理由で、RailsとRubyのやりとりがどうなっているのかわかりません。Ruby on RailsとSymbolを使ったメソッドの呼び出し基本質問

私は要点に着きます。これは私のがらくたを混乱させる

class Product < ActiveRecord::Base 
default_scope :order => 'title' 
end 

:Ruby on Railsプロジェクトではたとえば、あなたがこのようなものを持っているかもしれません。私は、基本的なActiveRecordクラスから継承するメソッドdefault_scopeを呼び出していると仮定して、いくつかのオプションを設定することができます。これにシンボルorder => 'title'を渡します。 is:default_scope関数内のハッシュ値を順序付けし、そのハッシュ値を 'title'として設定していますか?私はそれを正しく得ていますか?あなたはあなたの中に基本的な検証をスローし始め例えばまた

は、この

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 } 

のような何かを得る私はこれが何を知っているが、その構文は私の心を吹きます。まず、静的に再利用される文字列値にシンボルが使用されているように見えますが、ここで動的シンボルを送信しています。そして、私たちはシンボル内のシンボルですか?それは基本的にハッシュ内のハッシュですか、それとも正確に何をしていますか?私は実際に何が起こっているのかを実際に理解するために、私の脳の中でそれを追跡しようとしています。

答えて

5

を意味します。ソースコードdefault_scopeを表示するには、hereにアクセスしてください。

オプションのHashをパラメータとして使用する方法です。

これは、この方法は

def foobar(options = {}) 
    p options 
end 

しかしを注意してください、のように定義されている場合

default_scope :order => 'title' 

は、Rubyで

default_scope({ :order => 'title' }) 

としてそれを書くと同じです構文の微妙な違い。上記のように、()を残しておけば、{}ルビーはまったく異なるものとして理解しています。 Rubyは、引数としてcode blockを受け入れる方法default_scopeを見ます。

default_scope { # code block } 

このメソッドの定義は、read thisをどのように動作するかルビーのブロックを理解するために

def foobar(&block) 
    yield 
end 

、次のようになります。

あなたはそれが好きで呼び出すことができます

foobar :key_1 => 'value_1', "key_2" => 'value_2' 

とRubyはそれがあることを理解し、

foobar({ :key_1 => 'value_1', "key_2" => 'value_2' }) 

ハッシュのキーは、または記号であってもなくてもよいです。列属性priceの検証ヘルパーメソッドについては、

validates :price, :numericality => { :greater_than_or_equal_to => 0.01 } 

validates(:price, { :numericality => { :greater_than_or_equal_to => 0.01 } }) 

これは、のような

def validates(column_attr, options = {}) 
    # perform validation of column_attr 
end 
0
default_scope :order => 'title' 

は、Rubyを使用して、この場合には括弧と中括弧を省略することができますメソッド呼び出し

default_scope({:order => 'title'}) 

です。

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 } 

あなたのActiveRecord ::ベースから継承された方法、であるdefault_scopeを想定に正しい

validates(:price, {:numericalcity => {:greater_than_or_equal_to => 0.01 } }) 
+4

メソッド定義に似ている、と同じです

あなたの例は間違っています: 'default_scope {:order => 'title'}'はブロックとみなされ、ハッシュパラメータではありません。 'default_scope({:order => 'title'})'と書かなければなりません。 – juandebravo