2017-10-18 175 views
1

我想在房間列表中添加照片上傳部分。當我嘗試點擊照片時出現此錯誤未定義的方法`count'爲零: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。我看不到你調用的代碼中還有其他地方,但是它調用的地方還沒有定義實例變量。你的控制器創建方法只顯示它發生在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 

或者何苦鑑於使用單獨@photos時,你應該能夠只是調用@room.photos在它的位置。

與其說.count可以在視圖您的條件的,可以使用@room.photos.present?

還有一個建議是傾向於使用積極if情況。所以更改

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

而且,人們會認爲創建操作之前,你需要在你的控制器新動作,其中一個會想到,如果真的需要從@room.photos隔離@photos被定義。這是rails中的標準MVC,但不確定是否已正確地發佈了所有代碼,所以我在這裏猜測。

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

如果失敗與錯誤'未定義的方法對於零級',那麼它意味着@photos是零,因此你不能對它執行任何方法。你在哪裏打電話?你沒有把它包含在你的代碼中。

當你點擊鏈接時,看看你的服務器日誌,它會告訴你你打哪個控制器動作。無論你打哪一個動作,你都需要定義@photos。

如果是照片#create(上面列出的控制器動作),則表示@ room.photos爲零。這是不太可能的,因爲它幾乎肯定會返回一個空的活動記錄關係(如果有的話),所以你的問題不是在控制器中定義@photos,而是當時使用的動作。

1

上面的人已經給出了很好的解釋,爲什麼你不能調用一個無類的方法。此外,也許下面的代碼將有助於您的情況:

<% if [email protected]? && @photos.count > 0 %> 
相關問題