【问题标题】:Deep nested partial does not recognize local variable深层嵌套部分无法识别局部变量
【发布时间】:2015-12-08 19:13:11
【问题描述】:

在 rails (4.2.3) 应用程序中,我有一个使用深层嵌套部分的表单。我将两个变量(表单对象和设置字符串)作为局部变量传递给局部链。在链下大约三个级别,部分不识别传入的变量。

views/posts/new.html.erb

<%= form_for @post do |f| %>
  <% setting = get_setting %>
  ... 
  <%= render 'partials_folder/partial1', locals: { f: f, setting: setting } %>
  ...
<% end %>

# views/partials_folder/_partial1.html.erb
<%= render 'partials_folder/partial2', locals: { f: f, setting: setting } %>

# views/partials_folder/_partial2.html.erb
# f and setting are valid here
<%= f.inspect %> #=> <FormBuilder....>
<%= render 'partials_folder/partial3', locals: { f: f, setting: setting } %>

# views/partials_folder/_partial3.html.erb
# next line raises NameError "undefined local variable or method `f'"
<%= f.inspect %>

是否存在局部嵌套深度的限制,或者我正在达到堆栈大小的限制(因为表单对象被复制下来)?

【问题讨论】:

  • setting 也未定义还是只是f
  • @carlosramireziii settingf 均未定义
  • 如果您更改该特定部分的名称,它会起作用吗?例如。 render 'partials_folder/partial3', locals: { foo: f, bar: setting } 然后&lt;%= foo.inspect %&gt;
  • 尝试检查您定义的内容 - 在 partial3 中添加 &lt;%= local_assigns.inspect %&gt;
  • @Anand - 您可能会在一个块中使用f,该块在另一个上下文中进行评估。变量在一个块中应该仍然可用,所以我的假设是 ActionView 正在使用方法缺失逻辑从 local_assigns 中获取值,并且这个方法缺失在这个特定块的上下文中不可用。您可以尝试在部分的最顶部执行 &lt;% form = f %&gt; 并使用 form 而不是 f。

标签: ruby-on-rails partials


【解决方案1】:

partial3中可以通过local_assigns[:locals][:f]local_assigns[:locals][:settings]访问局部变量

或者更好的是,您可以在视图中使用render partial: "partial_name", locals: {locals},这样您就可以拥有

<%= form_for @post do |f| %>
  <% setting = get_setting %>
  ... 
  <%= render partial: 'partials_folder/partial1', locals: { f: f, setting: setting } %>
  ...
<% end %>

# views/partials_folder/_partial1.html.erb
<%= render partial: 'partials_folder/partial2', locals: { f: f, setting: setting } %>

# views/partials_folder/_partial2.html.erb

<%= render partial: 'partials_folder/partial3', locals: { f: f, setting: setting } %>

# views/partials_folder/_partial3.html.erb

<%= f.inspect %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多