2014-07-06 182 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