mik*_*416 2 ruby-on-rails ujs ruby-on-rails-3 ruby-on-rails-4
我已经阅读/研究了其他答案,但我无法让它发挥作用.我有一个渲染部分的js.erb文件.我想将@node变量传递给它,但我在控制台中收到错误NameError: - undefined local variable or method "node" for #<#<Class:0x007fdcd9163510>:0x007fdcd813b728>
我不确定为什么它不会抓住它.
<div id="tagged_users">
<%= render partial: "nodes/user_tag_list", locals: { node: node } %>
</div>
Run Code Online (Sandbox Code Playgroud)
我想在js.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>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
最后,js.erb文件:
$("#tagged_users").html("<%= escape_javascript(render 'user_tag_list', locals: { node: @node }) %>");
Run Code Online (Sandbox Code Playgroud)
几个笔记.逻辑是合理的.如果我用字符串替换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 %>
Run Code Online (Sandbox Code Playgroud)
呃,根本不是变量范围.在我上面的js.erb文件中,我最初有:
$("#tagged_users").html("<%= escape_javascript(render 'user_tag_list', locals: { node: @node }) %>");
Run Code Online (Sandbox Code Playgroud)
请注意,上面我说user_tag_list是部分?好吧,我没有在我的render语句中指定它.我需要将代码修改为以下内容:
$("#tagged_users").html("<%= escape_javascript(render partial: 'user_tag_list', locals: {node: @node}) %>");
Run Code Online (Sandbox Code Playgroud)
然后它奏效了.如果其他人在调试这种类型的代码时遇到问题,看看它是否是变量,我会通过以下步骤创建控制台消息:
确保可以看到变量
console.log("<%= @node %>"); response: #<Node:0x007fdcd8203138>
Run Code Online (Sandbox Code Playgroud)为了确认我写了几个控制台语句,它们会从对象中提取一些内容,以确保捕获正确的信息
console.log("<%= @node.id %>"); response: 49
console.log("<%= @node.name %>"); response: 'Test 2'
Run Code Online (Sandbox Code Playgroud)一旦我看到变量被传递,我就知道这不是问题,并且它确保我的render语句格式正确.失踪partial是一个很大的错误,花了我几个小时的生命.我希望这个帖子得到你的回复.
附加信息
我在调试时学到的另一件事:如果你想设置局部变量而不是实例变量(无论出于何种原因我不确定)你可以在你的控制器动作中的render语句中创建它
respond_to do |format|
format.js { render 'user_tag_add.js.erb', locals: {node: @node} }
end
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的js.erb文件中做这样的事情
console.log("<%= node %>")
Run Code Online (Sandbox Code Playgroud)