我目前正在拆分一些代码以使其更具可重用性,其他代码更简洁。
我意识到除了locals
变量之外,我在form
哈希中传递了很多选项,并且所有这些选项似乎只能直接应用于我正在创建的输入对象。 / p>
我在考虑将locals hash合并到包含一些默认值的另一个,并将其传递给输入创建函数。
经过一些研究这样的API文档之后:
并在堆栈跟踪中找到最后两个方法:
From: .../.rvm/gems/ruby-2.1.5@ux-rails3.2/gems/actionpack-3.2.22.5/lib/action_view/template.rb @ line 145 ActionView::Template#render_without_mini_profiler:
... 2.1.5 (#<ActionView::Template:0x007fa41e138cc8>):0 >
From: .../app/views/shared/_checkbox_group.html.erb @ line 3 ActionView::CompiledTemplates#_app_views_shared__checkbox_group_html_erb___4197967411385159258_70171427980900:
... 2.1.5 (#<#<Class:0x007fa40f30fec0>:0x007fa40fe71c50>):0 >
答案 0 :(得分:0)
从问题的措辞中可能很方便,一种方法是不花时间潜入Rails模板渲染框架代码和文档,而只是简单地提供我提到的本地哈希的选项,包含在单个属性中包含它们的新哈希,并将其传递给模板。
稍后我使用该哈希与模板内部的默认哈希合并,并将其传递给输入函数。
我可以离开Q&amp; A,以防我可能仍然有人想要直接访问locals
哈希,或者甚至可以开发一种可能的替代方法。
所以我潜入铁路模板渲染框架......
2.1.5 (#<#<Class:0x007fc01d352e08>:0x007fc018879698>):0 > self.class
=> #<Class:0x007fc01d352e08>
up
进入actionpack-3.2.22.5/lib/action_view/template.rb:145
找到这个:2.1.5 (#<ActionView::Template:0x007fc011e90510>):0 > method_name
=> "_app_views_shared__adrad_index_html_erb___3381877171036202789_70231455466120"
2.1.5 (#<ActionView::Template:0x007fc011e90510>):0 > view.method(method_name.to_sym)
=> #<Method: #<Class:0x007fc01d352e08>(ActionView::CompiledTemplates)#_app_views_shared__adrad_index_html_erb___3381877171036202789_70231455466120>
2.1.5 (#<ActionView::Template:0x007fc011e90510>):0 > view.method(method_name.to_sym).source_location
=> ["<our project_path>/app/views/shared/some.html.erb", 0]
最后一点不是很好,但后来我开始寻找ActionView::CompiledTemplates
,遗憾的是,您不能使用source_location
来查找或实例变量声明(不同问:))。
我决定随机搜索actionpack-.../lib/action_view/
目录以在context.rb
中查找引用,但是我没有查看template.rb
内部,而是直接搜索{ {1}}现在在那个宝石的文件中。
locals
没有多大帮助,resolver.rb
也没有。template_renderer.rb
并找到了template.rb
熟悉的上述堆栈框架,我的回答必须介于其与包含render
属性的实际页面之间,locals
了解了它的定义,compile!
,ActionView::CompiledTemplates
,compile
。local_assigns
的定义,因为它也被使用并验证这是我正在寻找的源变量枚举!<强>答案强>
locals_code
!
此外,我目前不相信散列提供了我想要避免的任何属性,例如仅特定于当前部分模板页面的任何信息,我不希望将其传播到子部分模板页面。
<强>更新强>
我开始用这个变量做更多的事情,我想知道我是否有限。
我想混合一些默认值,这可能涉及使用local_assigns
,但它无法创建新的局部变量(How to dynamically create a local variable?),所以我可能只需要使用自己的嵌套数据结构现在..