1

Ich versuche, einen Foto-Upload-Abschnitt in meiner Zimmerliste zu haben. wenn ich versuche, auf die Fotos zu klicken, bekomme ich diesen Fehlerundefined methode `count 'für nil: NilClass rails

undefined method 'count' for nil:NilClass rails <% if @photos.count > 0 %>.

Ich habe eine photo_upload.html.erb Seite hinzugefügt und a _room_menu teilweise aber immer noch bekomme ich den Fehler.

hier ist mein Code:

photos_controller.rb

 class PhotosController < ApplicationController 
     def create 
      @room = Room.find(params[:room_id]) 
      if params[:images] 
      params[:images].each do |img| 
       @room.photos.create(image:img) 
      end 
      @photos = @room.photos 
      redirect_back(fallback_location:request.referer, notice: "Saved...") 
     end 
     end 


    end 

**views/rooms/photo_upload.html.erb** 

<div class="row"> 
    <div class="col-md-3"> 
    <%= render 'room_menu' %> 
    </div> 
    <div class="col-md-9"> 
    <div class="panel panel-default"> 

     <div class="panel-heading"> 
     Photos 
     </div> 

     <div class="panel-body"> 
     <div class="container"> 
      <div class="row"> 
      <div class="col-md-offset-3 col-md-6"> 
       <!-- PHOTOS UPLOAD GOES HERE --> 

       <%= form_for @room, url: room_photos_path(@room), method: 'post', html: {multipart: true} do |f| %> 
       <div class="row"> 
        <div class="form-group"> 
        <span class="btn btn-default btn-file text-babu"> 
         <i class="fa fa-cloud-upload" aria-hidden="true"></i> Select Photos 
         <%= file_field_tag "images[]", type: :file, multiple: true %> 
        </span> 
        </div> 
       </div> 

       <div class="text-center"> 
        <%= f.submit "Add Photos", class: "btn btn-form" %> 
       </div> 

       <% end %> 
      </div> 
      </div> 

      <div id="photos"><%= render 'photos/photos_list' %></div> 
     </div> 
     </div> 

    </div> 
    </div> 
</div> 

views/Zimmer/_room_menu.html.erb

<ul class="sidebar-list"> 
    <li class="sidebar-item"> 
    <%= link_to "Listing", listing_room_path, class: "sidebar-link active" %> 
    <span class="pull-right text-babu"><i class="fa fa-check"></i></span> 
    </li> 
    <li class="sidebar-item"> 
    <%= link_to "Pricing", pricing_room_path, class: "sidebar-link active" %> 
    <% if [email protected]? %> 
     <span class="pull-right text-babu"><i class="fa fa-check"></i></span> 
    <% end %> 
    </li> 
    <li class="sidebar-item"> 
    <%= link_to "Description", description_room_path, class: "sidebar-link active" %> 
    <% if [email protected]_nam.blank? %> 
     <span class="pull-right text-babu"><i class="fa fa-check"></i></span> 
    <% end %> 
    </li> 

    <li class="sidebar-item"> 
    <%= link_to "Photos", photo_upload_room_path, class: "sidebar-link active" %> 
    <% if [email protected]? %> 
     <span id="photo_check" class="pull-right text-babu"><i class="fa fa-check"></i></span> 
    <% end %> 
    </li> 

    <li class="sidebar-item"> 
    <%= link_to "Amenities", amenities_room_path, class: "sidebar-link active" %> 
    <span class="pull-right text-babu"><i class="fa fa-check"></i></span> 
    </li> 
    <li class="sidebar-item"> 
    <%= link_to "Location", location_room_path, class: "sidebar-link active" %> 
    <% if [email protected]? %> 
     <span class="pull-right text-babu"><i class="fa fa-check"></i></span> 
    <% end %> 
    </li> 
</ul> 
<hr/> 
+0

Würde auch gut sein, um den ganzen Code loszuwerden, der nicht benötigt wird, um den Fehler zu reproduzieren. – Kris

Antwort

1

Sie können .count nicht auf eine Null aufrufen. @Fotos müssen zuerst instanziiert werden. Ihr Controller scheint @photos überhaupt nicht zu instanziieren. Ich kann nicht sehen, wo sonst in Ihrem Code Sie anrufen @photos, aber wo es aufgerufen wird, ist die Instanzvariable noch nicht definiert. Ihre Controller-Methode zeigt nur an, dass es passiert, wenn params[:images] vorhanden ist, andernfalls ist es Null. Versuchen Sie, @photos außerhalb des if-Blocks zu instanziieren.

def create 
    @room = Room.find(params[:room_id]) 
    @photos = @room.photos 
    if params[:images] 
    params[:images].each do |img| 
     @room.photos.create(image:img) 
    end 
    redirect_back(fallback_location:request.referer, notice: "Saved...") 
    end 
end 

Oder warum die Mühe getrennt @photos in Sicht zu verwenden, wenn Sie sollten nur in der Lage sein @room.photos zu nennen in seinen Platz.

Statt .count als bedingte in der Ansicht aufrufen, verwenden @room.photos.present?

Ein weiterer Vorschlag verwenden positive if Fall zu bevorzugen ist. ändern, so

if [email protected]? 
# better to use this below 
if @room.photos.present? 

Auch würde man annehmen, bevor eine Aktion erstellen, können Sie eine neue Aktion in Ihrem Controller benötigen, wo man erwarten würde @photos definiert werden, ob es wirklich von @room.photos isoliert benötigt werden. Dies ist Standard-MVC in Rails, aber nicht sicher, ob Sie Ihren gesamten Code richtig gepostet haben, also rate ich hier.

1
<% if @photos.count > 0 %> 

Wenn dies mit einem nicht Fehler 'undefinierte Methode Für nil class 'bedeutet das, dass @photos null ist und Sie daher keine Methoden darauf anwenden können. Wo rufst du es an? Sie haben es nicht in Ihren Code aufgenommen.

Wenn Sie auf den Link klicken, sehen Sie sich Ihre Serverprotokolle an und erfahren Sie, welche Controller-Aktion Sie treffen. Welche Aktion Sie auch immer ausführen, Sie müssen @ Fotos definieren.

Wenn es Fotos # create (die Controller-Aktion, die Sie oben aufgeführt) ist, bedeutet es, dass @ room.photos ist Null. Das ist unwahrscheinlich, da es mit ziemlicher Sicherheit eine leere Active Record-Beziehung zurückgeben würde, so dass Ihr Problem nicht darin besteht, @ Fotos im Controller und in der Aktion zu definieren, die Sie gerade verwenden.

1

Die oben genannten Personen haben bereits gute Erklärungen gegeben, warum man eine Methode für eine Nullklasse nicht aufrufen kann.Darüber hinaus wird der folgende Code möglicherweise in Ihrer Situation helfen:

<% if [email protected]? && @photos.count > 0 %> 
Verwandte Themen