Rails 4 获取局部变量到 js.erb 文件
Rails 4 getting local variable to js.erb file
我有 read/researched 其他答案,但我无法让它发挥作用。我有一个 js.erb 文件正在渲染部分文件。我想将 @node 变量传递给它,但我在控制台中收到错误 NameError: - undefined local variable or method "node" for #<#<Class:0x007fdcd9163510>:0x007fdcd813b728>
我不确定为什么它不抓取它。
_node.html.erb(节点在这个partial中是局部变量):
<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>
节点#更新控制器操作:
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 %>
呃,根本不是变量作用域。在我上面的 js.erb 文件中,我最初有:
$("#tagged_users").html("<%= escape_javascript(render 'user_tag_list', locals: { node: @node }) %>");
注意到上面我说的 user_tag_list 是部分的吗?好吧,我没有在渲染语句中指定它。我需要将代码修改为以下内容:
$("#tagged_users").html("<%= escape_javascript(render partial: 'user_tag_list', locals: {node: @node}) %>");
然后就成功了。如果其他人在调试此类代码以查看它是否是变量时遇到问题,我将按照以下步骤创建控制台消息:
确保变量可见
console.log("<%= @node %>"); response: #<Node:0x007fdcd8203138>
为了确认我写了几个控制台语句,这些语句将从对象中提取一些东西以确保捕获了正确的信息
console.log("<%= @node.id %>"); response: 49
console.log("<%= @node.name %>"); response: 'Test 2'
一旦我看到正在传递变量,我就知道这不是问题所在,它看起来确保我的 render
语句格式正确。缺少 partial
是一个大错误,它让我损失了几个小时的生命。我希望这个 post 保存能让你有时间回来。
附加信息
我在调试时学到的另一件事:如果您想设置局部变量而不是实例变量(无论出于何种原因我不确定),您可以在控制器操作中的渲染语句中创建它
respond_to do |format|
format.js { render 'user_tag_add.js.erb', locals: {node: @node} }
end
然后你可以在你的 js.erb 文件中做这样的事情
console.log("<%= node %>")
我有 read/researched 其他答案,但我无法让它发挥作用。我有一个 js.erb 文件正在渲染部分文件。我想将 @node 变量传递给它,但我在控制台中收到错误 NameError: - undefined local variable or method "node" for #<#<Class:0x007fdcd9163510>:0x007fdcd813b728>
我不确定为什么它不抓取它。
_node.html.erb(节点在这个partial中是局部变量):
<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>
节点#更新控制器操作:
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 %>
呃,根本不是变量作用域。在我上面的 js.erb 文件中,我最初有:
$("#tagged_users").html("<%= escape_javascript(render 'user_tag_list', locals: { node: @node }) %>");
注意到上面我说的 user_tag_list 是部分的吗?好吧,我没有在渲染语句中指定它。我需要将代码修改为以下内容:
$("#tagged_users").html("<%= escape_javascript(render partial: 'user_tag_list', locals: {node: @node}) %>");
然后就成功了。如果其他人在调试此类代码以查看它是否是变量时遇到问题,我将按照以下步骤创建控制台消息:
确保变量可见
console.log("<%= @node %>"); response: #<Node:0x007fdcd8203138>
为了确认我写了几个控制台语句,这些语句将从对象中提取一些东西以确保捕获了正确的信息
console.log("<%= @node.id %>"); response: 49 console.log("<%= @node.name %>"); response: 'Test 2'
一旦我看到正在传递变量,我就知道这不是问题所在,它看起来确保我的 render
语句格式正确。缺少 partial
是一个大错误,它让我损失了几个小时的生命。我希望这个 post 保存能让你有时间回来。
附加信息
我在调试时学到的另一件事:如果您想设置局部变量而不是实例变量(无论出于何种原因我不确定),您可以在控制器操作中的渲染语句中创建它
respond_to do |format|
format.js { render 'user_tag_add.js.erb', locals: {node: @node} }
end
然后你可以在你的 js.erb 文件中做这样的事情
console.log("<%= node %>")