2016-09-03 5 views
4

a method described in the Rails APIある:なぜこのスコープのラムダにブロックが続くのですか?ここ

scope(name, body, &block)  

これもRailsのAPIに記載されている方法を使用した例である。

class Shirt < ActiveRecord::Base 
    scope :red, -> { where(color: 'red') } do 
    def dom_id 
     'red_shirts' 
    end 
    end 
end 

質問は、次のコードについてです:

do 
    def dom_id 
    'red_shirts' 
    end 
end 

それは何のために立つのですか?ブロックについてラムダに続くRubyの構文を見つけることができません。私は何か見落としてますか?助けてくれてありがとう。

+0

ヒント:ラムダは他のオブジェクトとまったく同じオブジェクトです。 ' - > {where(color: 'red')}'と '42'の間には違いはありません。さて、位置的な引数とブロックの両方を取るメソッドを見たことがありますか?例えば。 Railsでは 'respond_with'ですか?まあ、それは 'スコープ'と違いはありません。 –

+0

これは2つの点が混乱しています。 1.それは 'のように見える'ラムダとの接続ではなく、スコープです。 2、3番目のオプションのproc paramsはより欺瞞的になります –

答えて

2

例では、ラムダはscopeの2番目の通常の引数で、ブロックはscopeのブロック引数です(ラムダ構文には関係ありません)。

The block lets you define what ActiveRecord calls "extensions"、アソシエーションの戻り値で呼び出すことができるメソッド。あなたの例で定義された方法は、このように呼ばれることになります。

Shirt.red.dom_id 

has_many associations can be extended in the same way.それはビュー層に関係しているため、この例では、少し奇妙です。拡張機能は、ファインダやクリエイターのようなものによく使われます。

+0

お返事ありがとうございました。 –

1

dom_id id Shirt.red.dom_idを呼び出すことはできますが、Shirt.dom_idを呼び出すことはできません。いくつかのスコープに属するメソッドしか必要ない場合

+0

私はスコープの意味を知っていますが、lambda.isの後ろにこのブロックを記述した後はこのブロックを理解できません。 –

1

私は問題があると思います。

def testLambdaParams(name,body) 
    puts name 
    body.call 
    yield "testLambdaParams_yield" if block_given? 
end 

second_proc = -> do 
    puts "second_proc" 
    yield 'second_proc' if block_given? 
end 


testLambdaParams "first_params",second_proc do |x| 
    puts "block exec for testLambdaParams " + x 
end 

結果:

first_params 
second_proc 
block exec for testLambdaParams testLambdaParams_yield 

最後のブロックは、testLambdaParamsためラムダためませです。

関連する問題