Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何编写与块不隔离的DSL';什么是环境?_Ruby_Ruby On Rails 3_Dsl - Fatal编程技术网

Ruby 如何编写与块不隔离的DSL';什么是环境?

Ruby 如何编写与块不隔离的DSL';什么是环境?,ruby,ruby-on-rails-3,dsl,Ruby,Ruby On Rails 3,Dsl,我正试图编写一个小的Ruby DSL,但无意中发现了一个不便之处。现在,我的“DSL”代码是,我的实现代码(在.html.erb文件中)是: 实现代码看起来不像DSL,因为t.field而不是简单的field。通过将DSL代码(第34行)中的@block.call替换为instance\u exec(@block),我几乎得到了我想要的东西,但随后我失去了所有ActionView功能(即链接到) 有没有一种方法可以在块中提供我的小DSL类的实例方法,同时保持Rails中包含的ActionPack

我正试图编写一个小的Ruby DSL,但无意中发现了一个不便之处。现在,我的“DSL”代码是,我的实现代码(在.html.erb文件中)是:

实现代码看起来不像DSL,因为
t.field
而不是简单的
field
。通过将DSL代码(第34行)中的
@block.call
替换为
instance\u exec(@block)
,我几乎得到了我想要的东西,但随后我失去了所有ActionView功能(即
链接到

有没有一种方法可以在块中提供我的小DSL类的实例方法,同时保持Rails中包含的ActionPack的助手方法的可用性?

可以通过以下方式(尽管有些粗糙和混乱)同时获得这两种方法:

现在您可以这样使用它:

def some_helper(arg); end

Table.new do
  field :name, some_helper("foo")
end
但是,使用这种方法时要小心:您仍然不能使用调用对象中的实例变量:

@field_url = "http://foo"

Table.new do
  # url will be nil, since the ivar does not exist on the Table
  field :name, @field_url 
end

我张贴了一份详细的答复

简短回答:看看gem——它让你很容易做到这一点

def some_helper(arg); end

Table.new do
  field :name, some_helper("foo")
end
@field_url = "http://foo"

Table.new do
  # url will be nil, since the ivar does not exist on the Table
  field :name, @field_url 
end