有没有办法从`partial`Rails ERB模板内部直接访问和/或操作`locals`哈希?

时间:2017-06-28 20:49:18

标签: ruby-on-rails hash

我目前正在拆分一些代码以使其更具可重用性,其他代码更简洁。

我意识到除了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 >
RVM,Ruby,Rails,Formtastic,Pry,Byebug,&amp;撬Byebug。

1 个答案:

答案 0 :(得分:0)

旧的,不那么有用的解决方法答案

从问题的措辞中可能很方便,一种方法是不花时间潜入Rails模板渲染框架代码和文档,而只是简单地提供我提到的本地哈希的选项,包含在单个属性中包含它们的新哈希,并将其传递给模板。

稍后我使用该哈希与模板内部的默认哈希合并,并将其传递给输入函数。

我可以离开Q&amp; A,以防我可能仍然有人想要直接访问locals哈希,或者甚至可以开发一种可能的替代方法。

更新

所以我潜入铁路模板渲染框架......

博览会

  1. 我开始只是采取这个:
  2. 2.1.5 (#<#<Class:0x007fc01d352e08>:0x007fc018879698>):0 > self.class
    => #<Class:0x007fc01d352e08>
    
    1. 这没什么用处,然后up进入actionpack-3.2.22.5/lib/action_view/template.rb:145找到这个:
    2. 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]
      
      1. 最后一点不是很好,但后来我开始寻找ActionView::CompiledTemplates,遗憾的是,您不能使用source_location来查找或实例变量声明(不同问:))。

      2. 我决定随机搜索actionpack-.../lib/action_view/目录以在context.rb中查找引用,但是我没有查看template.rb内部,而是直接搜索{ {1}}现在在那个宝石的文件中。

      3. locals没有多大帮助,resolver.rb也没有。
      4. 一旦我深入研究template_renderer.rb并找到了template.rb熟悉的上述堆栈框架,我的回答必须介于其与包含render属性的实际页面之间,
      5. 我跟着locals了解了它的定义,
      6. 看到一个熟悉的compile!
      7. 然后是ActionView::CompiledTemplates
      8. 发现了一个有趣的任意,文字,元源操作,因为我有点期待中间缺少更多的堆栈帧,而回调式命名方案,我发现这个奇怪的变量,作为一个参数动态生成的模板函数:compile
      9. 我快速跳转到local_assigns的定义,因为它也被使用并验证这是我正在寻找的源变量枚举!
      10. <强>答案

        locals_code

        此外,我目前不相信散列提供了我想要避免的任何属性,例如仅特定于当前部分模板页面的任何信息,我不希望将其传播到子部分模板页面。

        <强>更新

        我开始用这个变量做更多的事情,我想知道我是否有限。 我想混合一些默认值,这可能涉及使用local_assigns,但它无法创建新的局部变量(How to dynamically create a local variable?),所以我可能只需要使用自己的嵌套数据结构现在..