2014-07-06 183 views
0

在情節389 of Railscasts,他創建了一個名爲SCOPE_SCHEMA方法,既被整個事件中使用的方法,但與do紅寶石方法塊

塊可以在任何方法來完成這樣也傳遞? (*paths)代表什麼?我該如何創建一個可以成爲塊的方法?我看了看link_to源代碼,並在可能安排發送給最終&block注意到你可以做

<%= link_to ....%> 

<%= link_to ... do %> 

<%end%> 

還是我不正確的?

集代碼:

after_create :create_schema 

def create_schema 
    connection.execute("create schema tenant#{id}") 
    scope_schema do 
    load Rails.root.join("db/schema.rb") 
    connection.execute("drop table #{self.class.table_name}") 
    end 
end 

def scope_schema(*paths) 
    original_search_path = connection.schema_search_path 
    connection.schema_search_path = ["tenant#{id}", *paths].join(",") 
    yield 
ensure 
    connection.schema_search_path = original_search_path 
end 

回答

1

任何方法都可以用,如果你把它定義爲這樣的塊被調用。代碼link_to就是一個很好的例子。

至於*paths,這是splat operator,這基本上意味着任何數量的參數可被給予的方法和將被讀取爲相同的參數 - 在這種情況下paths - 爲一個數組。

+0

那麼爲什麼在'scope_schema'的情況下沒有'&block'還沒有和'do'一起使用或者是由於splat操作符? –

+1

'scope_schema'方法中的'yield'產生了一個塊 - 我很抱歉,我不明白這是問題的一部分。 [這個答案](http://stackoverflow.com/a/3066939/2128691)很好地涵蓋了「yield」。 – dax

1

任何方法都可以這樣做嗎?

是的,只要你的方法的參數列表中可用的模塊:

def method(arg1, &block) 
    # do something with arg1 
    # call the block with or without arguments if a block is given: 
    block.call() if block_given? 
end 

def method(arg1) 
    # do somehting 
    yield 
end 

產量可以接收參數。

*(路徑)代表什麼?

'*'是splat操作符,可以根據需要爲您提供許多參數。 (與python相同)

而我該如何創建一個可以成爲塊的方法?

一種方法可以接收一個塊,或者在一個塊中被調用,但不能是一個塊。 雖然你可以在proc中創建一個'方法'。

a = ->(){ puts 'lalala' } 

a.call