【发布时间】:2015-11-18 04:24:25
【问题描述】:
我已经阅读/研究了其他答案,但我无法让它发挥作用。我有一个呈现部分的 js.erb 文件。我希望将@node 变量传递给它,但在控制台中出现错误NameError: - undefined local variable or method "node" for #<#<Class:0x007fdcd9163510>:0x007fdcd813b728>
我不知道为什么它不会抓住它。
_node.html.erb(node是本部分的局部变量):
<div id="tagged_users">
<%= render partial: "nodes/user_tag_list", locals: { node: node } %>
</div>
我也想在 js.erb 中渲染的部分
_user_tag_list.html.erb:
<ul>
<% node.tagged_users.map(&:name).each do |tag| %>
<li><%= tag %>
<%= link_to "x", node_path(node, remove_tag: tag), method: :patch %>
</li>
<% end %>
</ul>
node#update 控制器动作:
def update
@node = Node.find(params[:id])
if params.fetch(:node, {}).fetch(:autocomplete_tag_names, false)
tag = params[:node][:taggable_email]
@node.user_tag_list.add(tag)
@node.save
respond_to do |format|
format.js { render 'user_tag_add.js.erb' }
end
elseif
# ...
else
# ...
end
最后是 js.erb 文件:
user_tag_add.js.erb:
$("#tagged_users").html("<%= escape_javascript(render 'user_tag_list', locals: { node: @node }) %>");
一些笔记。逻辑是合理的。如果我用字符串而不是部分替换 html,它可以正常工作。另外,如果我 binding.pry 我可以将节点设置为 @node 而不会出现问题。只是无法让@node 传递给 js.erb 文件中的节点。
编辑
如果有用的话,这里是部分表单:
<%= form_for node, remote: true, html: { class: "edit_node tag-users" } do |f| %>
<%= f.label :autocomplete_tag_names %>
<%= f.text_field :autocomplete_tag_names, data: { autocomplete_source: users_path }, value: nil %>
<%= f.hidden_field :taggable_email, value: nil %>
<%= f.submit %>
<% end %>
【问题讨论】:
-
无论如何,您都在使用过时且不受欢迎的语法来渲染部分。停止使用
render partial: x, locals { y: z }并开始简单地使用render x, y: z。你的例子应该写成<%= render "nodes/user_tag_list", node: node %> -
谢谢@meager。好资料。这会解决我的问题吗?我想如果我包含
nodes/节点,它就会有。欣赏知识下降。
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ujs