2015-08-02 15 views
12

Tôi có một cuộc gọi một phần ban đầu trông như thế này:Tại sao khai báo biến cục bộ này không hoạt động?

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

Đó gọi này nodes/node từng phần (cắt ngắn cho ngắn gọn):

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

ở đâu bây giờ tôi nhận được lỗi này:

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

Tại dòng này:

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

Tại sao tùy chọn locals của tôi render partial:... không giải quyết vấn đề này?

Lưu ý rằng khai báo cục bộ trước đó của việc hiển thị một phần khác hoạt động tốt mà không có lỗi, do đó, không chắc chắn tại sao điều này không hoạt động.

Sửa 1

Đây là toàn bộ phần tìm thấy tại 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> 

Chỉnh sửa 2

Vì vậy, bên trong lỗi tốt hơn, ít REPL trong phạm vi quan điểm mà tôi gọi một phần trên, tức là đoạn mã đầu tiên trong câu hỏi này, tôi đã chơi xung quanh với bảng điều khiển và thấy rằng các biến cục bộ trong giây phần ond không được gán gì cả, mặc dù giá trị của chúng trả lại giá trị hợp phá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 
>> 

Tại sao việc chuyển nhượng không xảy ra?

+1

Điều gì sẽ xảy ra nếu bạn nhận xét '<% ​​= node_counter%>'? Bạn có gặp lỗi tại '<% = node.media.try (: thumbnail_url)%>'? – tompave

+0

Câu hỏi hay. Tôi chưa bao giờ thử điều đó trước đây, nhưng tôi đã làm và bây giờ tôi nhận được một 'biến địa phương hoặc phương thức 'nút' không xác định tại dòng đó. Có phải tôi không thể hiển thị hai phần tử trong cùng một lần lặp của khối 'mỗi' không? – marcamillion

+0

Không, đó không phải là vấn đề. Bạn có thể đăng toàn bộ một phần và toàn bộ đường dẫn/tên tệp không? – tompave

Trả lời

7

Vấn đề là bạn đang gọi một phần tên là 'nút' và vì vậy đường ray dự kiến ​​sẽ xác định nodenode_counter thông qua các phương tiện khác. Bạn có thể sửa mã của bạn bằng cách làm như sau:

<%= render partial: 'nodes/node', object: event.eventable.node, locals: { new_node_counter: index } %>

tôi tin rằng bạn sẽ cần phải sử dụng một tên biến khác nhau cho các node_counter. Nếu bạn cần phải sử dụng biến node_counter vì các trang khác sử dụng phần này, bạn luôn có thể làm điều gì đó ở phía trên cùng của phần 'nút/nút' như thế này:

<% node_counter = node_counter || new_node_counter %>

Dưới đây là một số trích đoạn có liên quan từ http://guides.rubyonrails.org/layouts_and_rendering.html :

Every partial also has a local variable with the same name as the partial (minus the underscore). You can pass an object in to this local variable via the :object option:

<%= render partial: "customer", object: @new_customer %>

...

Rails also makes a counter variable available within a partial called by the collection, named after the member of the collection followed by _counter. For example, if you're rendering @products, within the partial you can refer to product_counter to tell you how many times the partial has been rendered. This does not work in conjunction with the as: :value option.

+0

Tôi đã thử cách này và hiện tôi đang gặp lỗi này từ bên trong' nút/_node.html.erb' của mình một phần: 'undefined local variable hoặc method 'node_counter' cho # <# : 0x007faf5bc3ef08>' – marcamillion

+0

Trên thực tế, một khi tôi đã thay đổi đề xuất của bạn một phần của tôi thành điều này: '<% node_counter = node_counter || new_node_counter%> 'nó hoạt động như một sự quyến rũ. Cảm ơn! – marcamillion

Các vấn đề liên quan