【问题标题】:Why does this locals variable declaration not work?为什么这个局部变量声明不起作用?
【发布时间】:2015-08-02 01:19:16
【问题描述】:

我有一个如下所示的初始部分调用:

 <% 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 %>

这称为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) %>');">

我现在在哪里得到这个错误:

undefined local variable or method `node_counter' for #<#<Class:0x007f9067394f50>:0x007f9063b7d8b0>

在这一行:

<div class="card" id="card-<%= node_counter %>">

为什么我的render partial:...locals 选项不处理这个问题?

请注意,其他部分渲染的先前 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>

编辑 2

因此,在 Better Errors 中,在 REPL 中我调用部分视图的范围内,即这个问题中的第一个代码 sn-p,我玩弄了控制台并看到尽管它们的值返回合法值,但根本没有分配第二部分:

>> 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
>>

为什么任务不会发生?

【问题讨论】:

  • 如果你评论&lt;%= node_counter %&gt;会发生什么?您在&lt;%= node.media.try(:thumbnail_url) %&gt; 收到错误消息吗?
  • 好问题。我以前从未尝试过,但我只是这样做了,现在我在那条线上得到了一个undefined local variable or method 'node'。是不是我不能在each 块的同一迭代中渲染两个部分?
  • 不,这应该不是问题。你能发布整个部分和完整的路径/文件名吗?
  • @tompave 完成。刷新问题。
  • 看起来不错。尝试使用简写形式,看看会发生什么:&lt;%= render 'nodes/node', node: event.eventable.node, node_counter: index %&gt;

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

问题是您正在调用一个名为“节点”的部分,因此 rails 期望通过其他方式定义 nodenode_counter。您可以通过执行以下操作来修复您的代码:

&lt;%= render partial: 'nodes/node', object: event.eventable.node, locals: { new_node_counter: index } %&gt;

我相信您需要为 node_counter 使用不同的变量名。如果您需要使用 node_counter 变量,因为其他页面使用此部分,您总是可以在部分“节点/节点”的顶部做一些事情,如下所示:

&lt;% node_counter = node_counter || new_node_counter %&gt;

以下是来自http://guides.rubyonrails.org/layouts_and_rendering.html的一些相关摘录:

每个部分还有一个与部分同名的局部变量(减去下划线)。您可以通过 :object 选项将对象传递给此局部变量:

&lt;%= render partial: "customer", object: @new_customer %&gt;

...

Rails 还在集合调用的部分中提供了一个计数器变量,该变量以集合成员命名,后跟 _counter。例如,如果您正在渲染 @products,则可以在部分中引用 product_counter 来告诉您部分已被渲染了多少次。这不能与 as: :value 选项一起使用。

【讨论】:

  • 我试过了,现在我从我的nodes/_node.html.erb partial:undefined local variable or method 'node_counter' for #&lt;#&lt;Class:0x007faf65021bf8&gt;:0x007faf5bc3ef08&gt;中得到了这个错误
  • 实际上,一旦我将您的部分建议更改为:&lt;% node_counter = node_counter || new_node_counter %&gt;,它就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多