未定义的方法`count'为零:NilClass rails
我想在房间列表中添加照片上传部分。当我尝试点击照片时出现此错误未定义的方法`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/>
您无法拨打.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,但不确定是否已正确地发布了所有代码,所以我在这里猜测。
<% if @photos.count > 0 %>
如果失败与错误'未定义的方法对于零级',那么它意味着@photos是零,因此你不能对它执行任何方法。你在哪里打电话?你没有把它包含在你的代码中。
当你点击链接时,看看你的服务器日志,它会告诉你你打哪个控制器动作。无论你打哪一个动作,你都需要定义@photos。
如果是照片#create(上面列出的控制器动作),则表示@ room.photos为零。这是不太可能的,因为它几乎肯定会返回一个空的活动记录关系(如果有的话),所以你的问题不是在控制器中定义@photos,而是当时使用的动作。
上面的人已经给出了很好的解释,为什么你不能调用一个无类的方法。此外,也许下面的代码将有助于您的情况:
<% if [email protected]? && @photos.count > 0 %>
也可以摆脱所有不需要的代码来重现错误。 – Kris