1

私は部屋のリストに写真アップロードセクションを持っています。写真をクリックしようとするとこのエラーが発生します定義されていないメソッド `count for nil:NilClass rails

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

photo_upload.html.erbページとa _room_menu部分を追加しましたが、まだエラーが表示されます。ここ

は私のコードです:

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> 

ビュー/部屋/ _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

エラーを再現するために必要なすべてのコードを削除するのも良いでしょう。 – Kris

答えて

1

.countをゼロにコールすることはできません。 @photosは最初にインスタンス化する必要があります。コントローラは@photosをインスタンス化するようには表示されません。 @photosを呼び出しているコードがどこにあるのかわかりませんが、どこで呼び出されていますか、インスタンス変数はまだ定義されていません。コントローラーの作成メソッドは、params[:images]が存在する場合にのみ発生することを示し、そうでない場合はゼロになります。 ifブロックの外側に@photosをインスタンス化しようとします。

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 

それとも、ただの場所で@room.photosを呼び出すことができる必要があるときに、なぜビューで別々の@photosを使ってわざわざ。代わりにビューで、条件として.countを呼び出す

、もう一つの提案は、正ifケースを使用することを好むことです@room.photos.present?

を使用しています。そのアクションを作成する前に、また、1が引き受ける

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

を変更する、あなたはそれが本当に@room.photosから分離することが必要である場合は、1つは@photosが定義されることを期待するあなたのコントローラで新しいアクションを必要としています。これは標準的なMVCのレールですが、私がここで推測しているようにすべてのコードを正しく投稿したかどうかはわかりません。

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

これがで失敗した場合エラー '未定義のメソッドfor nil class 'の場合は、@photosがnilであることを意味し、したがって、その上でメソッドを実行することはできません。どこを呼びますか?あなたはあなたのコードにそれを含めていません。

リンクをクリックすると、サーバーのログを見ると、どのコントローラの操作が当てはまるかがわかります。どちらのアクションでも、@photosを定義する必要があります。

photos#create(上記のコントローラアクション)の場合、@ room.photosはnilであることを意味します。それはほとんどありません。もし何かがあれば、空のアクティブなレコード関係がほぼ確実に返ってくるので、あなたの問題はコントローラで@photosを定義しておらず、その時点で使っているアクションです。

1

上記の人々は、なぜあなたがnilクラスでメソッドを呼び出せないのかについて大きな説明をしています。また、次のコードがあなたの状況に役立つかもしれません:

<% if [email protected]? && @photos.count > 0 %> 
関連する問題