【问题标题】:rails fields_for render partial with multiple locals producing undefined variablerails fields_for 渲染局部,多个局部变量产生未定义的变量
【发布时间】:2011-05-14 00:49:15
【问题描述】:

全部,

我在使用标准 fields_for 设置时遇到问题。在我的“_form”部分中,我有:

<div class="comment_list">
  <%= f.fields_for :comments do |cf| %>
    <%= render :partial => 'comments/comment_fields', :locals => {:f => cf, :tester => true} %>
  <% end %>

  <%= link_to_add_fields "Add a comment", f, :comments %>
</div>

在“_comment_fields”部分,我有常用字段,然后是我的测试变量:

<%= tester.to_s %>

当我删除 tester 变量时,一切正常。一旦我添加了测试变量,我就会得到这个错误:

ActionView::Template::Error(#Class:0xa1f3664>:0xa1f1bd4> 的未定义局部变量或方法 `tester')

有没有其他人在将 fields_for 与多个本地人一起使用时遇到过这个问题?


更详细地说,我的“_comment_fields”部分如下所示:

<div class="comment dynamic_field">
  <span class="comment_content"><%= f.text_field :content, :class => "comment_content" %></span>
  <%= tester.to_s %>
  <%= link_to_remove_fields "remove", f %>
</div>

仅从“_form”部分调用。

【问题讨论】:

  • 你确定你没有在多个地方渲染comment_fields吗?如果是,可以粘贴comment_fields吗?
  • 不幸的是,我只是从 _form 部分渲染comment_fields。仅当我尝试传递多个局部变量时才会出现此问题。
  • hakunin - 你是对的。我实际上是从两个地方调用它。第二个位置是在我使用 javascript 动态添加字段的一些方法中。

标签: ruby-on-rails ruby-on-rails-3 partial locals


【解决方案1】:

全部,

Hakunin 赚钱了。我不止一个地方打电话给局部。第二个位置是在我的辅助方法“link_to_add_fields”中。我使用它来使用 javascript 添加字段。

方法如下所示:

# generates add fields on a dynamic form
def link_to_add_fields(name, f, association, locals={})  
  new_object = f.object.class.reflect_on_association(association).klass.new  
  fields = f.fields_for(association, new_object, 
                      :child_index => "new_#{association}") do |builder|  
    render(association.to_s.singularize + "_fields", :f => builder)  
  end  

  link_to(name, "#", :class => "dynamic_add", 'data-association' => "#{association}",
                                            'data-content' => "#{fields}")
end  

请注意,这不允许将任何本地变量传递给渲染方法。我是这样改的:

# generates add fields on a dynamic form
def link_to_add_fields(name, f, association, locals={})  
  new_object = f.object.class.reflect_on_association(association).klass.new  
  fields = f.fields_for(association, new_object, 
                      :child_index => "new_#{association}") do |builder|  
    render(association.to_s.singularize + "_fields", locals.merge!(:f => builder))  
  end  

  link_to(name, "#", :class => "dynamic_add", 'data-association' => "#{association}",
                                            'data-content' => "#{fields}")
end  

现在我的 _form 部分中的 link_to_add_fields 调用如下所示:

<%= link_to_add_fields "Add a comment", f, :comments, :tester => true %>

...我可以动态地将字段添加到我的表单并传递其他本地人。希望这会帮助其他人。

【讨论】:

【解决方案2】:

改变:

<%= render :partial => 'comments/comment_fields', :locals => {:f => cf, :tester => true} %>

到:

<%= render 'comments/comment_fields', :locals => {:f => cf, :tester => true} %>

我也遇到了同样的问题。

【讨论】:

  • 谢谢,但我不认为那是我当时的原始问题......我也认为你上面的两个陈述是等价的,因为没有参数的渲染默认使用部分...... guides.rubyonrails.org/…
【解决方案3】:

我不清楚为什么需要在表单字段中使用测试器变量。但是您能否粘贴一段代码,您如何以部分形式使用测试器变量。

我坚信

 不应产生任何问题,因为它只显示该变量的值
    

【讨论】:

  • tester 变量就是……一个测试。在上面,评论属于文章。文章属于一个帐户。我真正想做的是通过文章的帐户。我的本地人实际上看起来像::locals => {:f => cf, :account => article.account}。不幸的是,这不起作用,我收到“未定义的变量”错误。作为调试的一部分,我使用这个“测试器”变量进行了简化。正如您所提到的,它不应该产生问题。这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多