2017-10-18 174 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 %> 
相关问题