Ruby 如何编写与块不隔离的DSL';什么是环境?
我正试图编写一个小的Ruby DSL,但无意中发现了一个不便之处。现在,我的“DSL”代码是,我的实现代码(在.html.erb文件中)是: 实现代码看起来不像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
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