mar*_*ion 12 ruby-on-rails ruby-on-rails-4
我有一个看起来像这样的初始部分调用:
<% events_array.each_with_index do |event, index| %>
<%= render partial: "events/activities/#{event.action}", locals: {event: event, index: index} %>
<section class="card-overlay valign-wrapper">
<div class="valign col s12 m6 l4 card-container">
<%= render partial: 'nodes/node', locals: {node: event.eventable.node, node_counter: index} %>
</div>
</section>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这称为nodes/node
部分(为简洁而截断):
<div class="col s12 m6 l4 card-container">
<div class="card" id="card-<%= node_counter %>">
<!-- Card Content -->
<div class="card-content" style="background-image: url('<%= node.media.try(:thumbnail_url) %>');">
Run Code Online (Sandbox Code Playgroud)
我现在在哪里收到此错误:
undefined local variable or method `node_counter' for #<#<Class:0x007f9067394f50>:0x007f9063b7d8b0>
Run Code Online (Sandbox Code Playgroud)
在这一行:
<div class="card" id="card-<%= node_counter %>">
Run Code Online (Sandbox Code Playgroud)
为什么locals
我的选择render partial:...
不能解决这个问题?
请注意,其他部分渲染的先前locals声明工作正常,没有错误,因此不确定为什么这不起作用.
编辑1
这是完整的部分发现 app/views/nodes/_node.html.erb
<div class="col s12 m6 l4 card-container">
<div class="card" id="card-<%#= node_counter %>">
<!-- Card Content -->
<div class="card-content" style="background-image: url('<%= node.media.try(:thumbnail_url) %>');">
<video id="video_<%= node_counter %>" class="card-video video-js vjs-default-skin" controls preload="none" data-setup="{}">
<source src="<%= node.media.try(:zc_mp4_url) %>" type='video/mp4' />
<p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>
</video>
<a class="video-close"><i class="icon-close"></i></a>
<div class="card-attr">
<!-- Favorites -->
<%= show_favorites_button(node, node_counter) %>
<%= favorites_count(node) %>
<!-- Comments -->
<%= comments_count(node) %>
</div>
<!-- Tagged Users -->
<div class="card-tagged-users">
<%= render partial: "nodes/tagged_user", collection: node.tagged_users %>
<span class="tagged-count"><%= node.cached_num_user_tags %></span>
</div>
<h3 class="card-title"><%= node.name %></h3>
</div>
<!-- End Tagged Users -->
<!-- Card Meta -->
<div class="card-meta">
<aside>
<%= image_tag node.user.avatar.url, class: "card-author-avatar", alt: "" %>
</aside>
<section>
<h6 class="card-author-name"><%= node.user.name %></h6>
<time class="card-date"><%= node.created_at.strftime("%B %d, %Y") %></time>
<p class="card-desc"><%= node.media.description %>
</section>
</div>
<!-- End Card Meta -->
<!-- Card Comments -->
<div class="card-comments-container">
<h4 class="card-comments-title"><%= pluralize(node.comments_count, "Comment") %></h4>
<a class="card-comments-expand"><i class="icon-arrow-down"></i></a>
<div class="card-comments">
<%= render partial: "nodes/comment", collection: node.comments.includes(:user).order(created_at: :desc) %>
</div>
</div>
<!-- End Card Comments -->
<!-- Card Input -->
<div class="card-input">
<%= simple_form_for([node, Comment.new], html: { id: "new_comment_card-#{node_counter}"}, remote: true) do |f| %>
<%= f.error_notification %>
<%= f.input_field :message, as: :text, id: "card-input-field-card-#{node_counter}", class: "input-field", placeholder: "Share your thoughts", cols: "30", rows: "10", "data-behavior" => "submit_on_enter" %>
<%= f.button :submit, "Submit", name: "card_id", value: "card-#{node_counter}", id: "submit-card-#{node_counter}", class: "comment-submit", data: { disable_with: "Submitting Comment..." } %>
<% end %>
</div>
<!-- End Card Input -->
<!-- End Card Content -->
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
编辑2
所以,在Better Errors里面,在我称之为局部的视图范围内的REPL,即这个问题中的第一个代码片段,我玩了控制台,看到第二个部分中的局部变量不是尽管它们的值返回合法值,但仍然被分配:
>> node
!! #<NameError: undefined local variable or method `node' for #<#<Class:0x007fbf389e01c0>:0x007fbf30cd3358>>
>> event.eventable.node
=> #<Node id: 3, name: "Outro", family_tree_id: 1, user_id: 1, media_id: 3, media_type: "Video", created_at: "2015-07-25 04:28:39", updated_at: "2015-08-01 23:11:26", circa: nil, is_comment: nil, cached_votes_total: 0, cached_votes_score: 0, cached_votes_up: 0>
>> node_counter
!! #<NameError: undefined local variable or method `node_counter' for #<#<Class:0x007fbf389e01c0>:0x007fbf30cd3358>>
>> index
=> 0
>>
Run Code Online (Sandbox Code Playgroud)
为什么这项任务不会发生?
问题是,您所呼叫的部分命名为"节点"等Rails是期待来定义node
和node_counter
通过其他手段.您可以通过执行以下操作来修复代码:
<%= render partial: 'nodes/node', object: event.eventable.node, locals: { new_node_counter: index } %>
我相信你需要为node_counter使用不同的变量名.如果你需要使用node_counter变量,因为其他页面使用这个部分,你总是可以在部分'nodes/node'的顶部做一些事情,如下所示:
<% node_counter = node_counter || new_node_counter %>
以下是http://guides.rubyonrails.org/layouts_and_rendering.html的一些相关摘录:
每个partial也有一个局部变量,其名称与partial(减去下划线)相同.您可以通过:object选项将对象传递给此局部变量:
<%= render partial: "customer", object: @new_customer %>
...
Rails还在集合调用的部分中提供了一个计数器变量,该集合以集合成员的名字命名,后跟_counter.例如,如果您正在渲染@products,则可以在partial_counter中引用product_counter来告诉您部分渲染的次数.这与as :: value选项不兼容.