1

내 방 목록에 사진 업로드 섹션을 만들려고합니다. 사진을 클릭하려고하면이 오류가 발생합니다.정의되지 않은 메소드 'count'for nil : NilClass 레일

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]이있는 경우에만 발생하는 것으로 표시하며, 그렇지 않으면 0이됩니다. 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를 호출

@room.photos.present?

또 하나 개의 제안을 긍정적 if 케이스를 사용하는 것을 선호하는 것입니다 사용합니다. 그래서 하나는 만드는 작업을하기 전에, 당신이 정말 @room.photos에서 격리 할 필요가있는 경우 하나 @photos 정의 할 기대 컨트롤러의 새로운 조치가 필요한 가정 것이다, 또한

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

변경합니다. 이것은 레일스의 표준 MVC이지만, 모든 코드를 올바르게 게시했는지 확신 할 수 없으므로 여기서 추측하고 있습니다.

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

이것이 실패하는 경우 : 여기

내 코드입니다 오류 '정의되지 않은 메서드 for nil class '이면 @photos가 nil이라는 것을 의미하므로 어떤 메소드도 수행 할 수 없습니다. 어디에서 부르니? 코드에 포함시키지 않았습니다.

링크를 클릭하면 서버 로그를보고 어떤 컨트롤러 동작이 발생했는지 알려줍니다. 어느 액션이든, @photos를 정의해야 할 곳입니다.

# photos (위에 나열된 컨트롤러 동작) 인 경우 @ room.photos가 nil임을 의미합니다. 그럴 것 같지 않은데, 무엇보다도 빈 레코드 레코드 관계를 반환 할 것이기 때문에 문제는 컨트롤러에서 @photos를 정의하지 못했고 그 시점에서 사용중인 작업이 정의되어 있지 않습니다.

1

위의 사람들은 nil 클래스에서 메서드를 호출 할 수없는 이유에 대해 이미 큰 설명을했습니다.또한 다음 코드가 도움이 될 수 있습니다.

<% if [email protected]? && @photos.count > 0 %> 
관련 문제