nil:NilClass rails 的未定义方法“计数”
undefined method `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>
views/rooms/_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 !@room.price.blank? %>
<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 !@room.listing_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 !@room.photos.blank? %>
<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 !@room.address.blank? %>
<span class="pull-right text-babu"><i class="fa fa-check"></i></span>
<% end %>
</li>
</ul>
<hr/>
<% if @photos.count > 0 %>
如果失败并出现错误 'undefined method for nil class',则意味着 @photos 为 nil,因此您无法对其执行任何方法。你在哪里打电话?您尚未将其包含在您的代码中。
当您点击 link 时,查看您的服务器日志,它会告诉您您正在点击哪个控制器操作。无论您点击哪个动作,都需要定义@photos。
如果它是 photos#create(你上面列出的控制器操作)那么这意味着 @room.photos 是 nil。这不太可能,因为它几乎肯定 return 一个空的活动记录关系,所以你的问题不是在控制器中定义 @photos 和你当时正在使用的操作。
您不能在 nil 上调用 .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
更新:Ruby 2.3+ 您可以使用 &
的安全导航:
def create
@room = Room.find(params[:room_id])
params[:images]&.each{|img| @room.photos.create(image: img)}
redirect_back(fallback_location: request.referer, notice: "Saved...")
end
或者当您应该能够直接调用 @room.photos
时,为什么还要在视图中使用单独的 @photos
。
不要调用 .count
作为视图中的条件,而是使用 @room.photos.present?
另一个建议是更喜欢使用正 if
大小写。所以改变
if !@room.photos.blank?
# better to use this below
if @room.photos.present?
此外,人们会假设在创建操作之前,您需要在控制器中定义一个新操作,如果它确实需要与 @room.photos
隔离,那么人们会期望定义 @photos
。这是 rails 中的标准 MVC,但不确定您是否已正确发布所有代码,所以我在这里猜测。
上面的人已经很好地解释了为什么你不能在 nil 上调用方法 class。此外,也许以下代码对您的情况有所帮助:
<% if !@photos.nil? && @photos.count > 0 %>
我想在我的房间列表中添加照片上传部分。当我尝试点击照片时出现此错误
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>
views/rooms/_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 !@room.price.blank? %>
<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 !@room.listing_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 !@room.photos.blank? %>
<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 !@room.address.blank? %>
<span class="pull-right text-babu"><i class="fa fa-check"></i></span>
<% end %>
</li>
</ul>
<hr/>
<% if @photos.count > 0 %>
如果失败并出现错误 'undefined method for nil class',则意味着 @photos 为 nil,因此您无法对其执行任何方法。你在哪里打电话?您尚未将其包含在您的代码中。
当您点击 link 时,查看您的服务器日志,它会告诉您您正在点击哪个控制器操作。无论您点击哪个动作,都需要定义@photos。
如果它是 photos#create(你上面列出的控制器操作)那么这意味着 @room.photos 是 nil。这不太可能,因为它几乎肯定 return 一个空的活动记录关系,所以你的问题不是在控制器中定义 @photos 和你当时正在使用的操作。
您不能在 nil 上调用 .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
更新:Ruby 2.3+ 您可以使用 &
的安全导航:
def create
@room = Room.find(params[:room_id])
params[:images]&.each{|img| @room.photos.create(image: img)}
redirect_back(fallback_location: request.referer, notice: "Saved...")
end
或者当您应该能够直接调用 @room.photos
时,为什么还要在视图中使用单独的 @photos
。
不要调用 .count
作为视图中的条件,而是使用 @room.photos.present?
另一个建议是更喜欢使用正 if
大小写。所以改变
if !@room.photos.blank?
# better to use this below
if @room.photos.present?
此外,人们会假设在创建操作之前,您需要在控制器中定义一个新操作,如果它确实需要与 @room.photos
隔离,那么人们会期望定义 @photos
。这是 rails 中的标准 MVC,但不确定您是否已正确发布所有代码,所以我在这里猜测。
上面的人已经很好地解释了为什么你不能在 nil 上调用方法 class。此外,也许以下代码对您的情况有所帮助:
<% if !@photos.nil? && @photos.count > 0 %>