Ruby on rails 用户控制器中没有方法错误//未定义的方法'any?';零级:零级
我试图让我网站上的用户能够查看其他用户上传的汽车。在用户查看自己汽车的主页上,我通过呈现存放用户汽车的Ruby on rails 用户控制器中没有方法错误//未定义的方法'any?';零级:零级,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图让我网站上的用户能够查看其他用户上传的汽车。在用户查看自己汽车的主页上,我通过呈现存放用户汽车的shared/feed来实现这一点。这样做不会产生任何错误,但当我呈现shared/feed以在另一个用户的页面上显示汽车时,我会在shared/feed的第二行获得nil:NilClass的未定义的方法'any' 共享/馈送 <div id="car_feed"> <% if @feed_items.any? %> <ul class="car
shared/feed
来实现这一点。这样做不会产生任何错误,但当我呈现shared/feed
以在另一个用户的页面上显示汽车时,我会在shared/feed
的第二行获得nil:NilClass的未定义的方法'any'
共享/馈送
<div id="car_feed">
<% if @feed_items.any? %>
<ul class="cars">
<%= render @feed_items %>
</ul>
<% else %>
<h3> You haven't added any cars yet.</h3>
<h3> Add one in the sidebar!</h3>
<% end %>
</div>
您还没有添加任何汽车。
在侧边栏中添加一个!
在主页上,这很好用
home.html.erb
<% if logged_in? %>
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<%= render 'shared/user_info' %>
</div>
<section class="hero-unit car_form">
<%= render 'shared/car_form' %>
</section>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
<% else %>
//landing page content
<% end %>
<div>
<%= render 'users/user' %>
</div>
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<h1><%= @user.name %></h1>
<h2><%= pluralize(@user.cars.count, "Car") %></h2>
</div>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
我的个人资料
我的车
//登录页内容
但是我在呈现显示页面时出错
show.html.erb
<% if logged_in? %>
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<%= render 'shared/user_info' %>
</div>
<section class="hero-unit car_form">
<%= render 'shared/car_form' %>
</section>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
<% else %>
//landing page content
<% end %>
<div>
<%= render 'users/user' %>
</div>
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<h1><%= @user.name %></h1>
<h2><%= pluralize(@user.cars.count, "Car") %></h2>
</div>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
\u user.html.erb
<% if logged_in? %>
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<%= render 'shared/user_info' %>
</div>
<section class="hero-unit car_form">
<%= render 'shared/car_form' %>
</section>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
<% else %>
//landing page content
<% end %>
<div>
<%= render 'users/user' %>
</div>
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<h1><%= @user.name %></h1>
<h2><%= pluralize(@user.cars.count, "Car") %></h2>
</div>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
我的个人资料
我的车
cars\u控制器
class CarsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy, :edit]
before_action :correct_user, only: [:destroy, :edit]
def create
@car = current_user.cars.build(cars_params)
respond_to do |format|
if @car.save
@feed_items = current_user.feed
format.html { redirect_to root_url }
format.js
else
format.html { render 'static_pages/home' }
format.js
end
end
end
def destroy
@car.destroy
flash[:success] = "Car deleted"
redirect_to request.referrer || root_url
end
def edit
@car.edit
flash[:success] = "Car edited"
redirect_to request.referrer || root_url
end
private
def cars_params
params.require(:car).permit(:year, :brand, :model, :vin, :mileage, :picture)
end
def correct_user
@car = current_user.cars.find_by(id: params[:id])
redirect_to root_url if @car.nil?
end
end
class UsersController < ApplicationController
before_action :logged_in_user, only: [:edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Thank you for signing up, welcome to ensage!"
redirect_to root_path
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end
private
def user_params
params.require(:user).permit(:name, :email, :phone, :password,
:password_confirmation)
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
def admin_user
redirect_to(root_url) unless current_user.admin?
end
end
class StaticPagesController < ApplicationController
def home
if logged_in?
@car = current_user.cars.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
def shop_home
if shop_logged_in?
@shop = current_shop
end
end
def help
end
def about
end
def contact
end
end
class CarsController
用户\u控制器
class CarsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy, :edit]
before_action :correct_user, only: [:destroy, :edit]
def create
@car = current_user.cars.build(cars_params)
respond_to do |format|
if @car.save
@feed_items = current_user.feed
format.html { redirect_to root_url }
format.js
else
format.html { render 'static_pages/home' }
format.js
end
end
end
def destroy
@car.destroy
flash[:success] = "Car deleted"
redirect_to request.referrer || root_url
end
def edit
@car.edit
flash[:success] = "Car edited"
redirect_to request.referrer || root_url
end
private
def cars_params
params.require(:car).permit(:year, :brand, :model, :vin, :mileage, :picture)
end
def correct_user
@car = current_user.cars.find_by(id: params[:id])
redirect_to root_url if @car.nil?
end
end
class UsersController < ApplicationController
before_action :logged_in_user, only: [:edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Thank you for signing up, welcome to ensage!"
redirect_to root_path
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end
private
def user_params
params.require(:user).permit(:name, :email, :phone, :password,
:password_confirmation)
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
def admin_user
redirect_to(root_url) unless current_user.admin?
end
end
class StaticPagesController < ApplicationController
def home
if logged_in?
@car = current_user.cars.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
def shop_home
if shop_logged_in?
@shop = current_shop
end
end
def help
end
def about
end
def contact
end
end
class UsersController
静态页面\u控制器
class CarsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy, :edit]
before_action :correct_user, only: [:destroy, :edit]
def create
@car = current_user.cars.build(cars_params)
respond_to do |format|
if @car.save
@feed_items = current_user.feed
format.html { redirect_to root_url }
format.js
else
format.html { render 'static_pages/home' }
format.js
end
end
end
def destroy
@car.destroy
flash[:success] = "Car deleted"
redirect_to request.referrer || root_url
end
def edit
@car.edit
flash[:success] = "Car edited"
redirect_to request.referrer || root_url
end
private
def cars_params
params.require(:car).permit(:year, :brand, :model, :vin, :mileage, :picture)
end
def correct_user
@car = current_user.cars.find_by(id: params[:id])
redirect_to root_url if @car.nil?
end
end
class UsersController < ApplicationController
before_action :logged_in_user, only: [:edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Thank you for signing up, welcome to ensage!"
redirect_to root_path
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end
private
def user_params
params.require(:user).permit(:name, :email, :phone, :password,
:password_confirmation)
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
def admin_user
redirect_to(root_url) unless current_user.admin?
end
end
class StaticPagesController < ApplicationController
def home
if logged_in?
@car = current_user.cars.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
def shop_home
if shop_logged_in?
@shop = current_shop
end
end
def help
end
def about
end
def contact
end
end
class StaticPagesController
如何修复此问题?如果没有看到您的控制器,我无法确认您是否将@feed\u items变量声明到了您的#show controller中,就像您声明了#index方法一样
如果您忽略了这一点,那么@feed\u项就不存在,这就是为什么要调用它。有吗?对nil变量的操作无效
更新
查看上一个静态控制器:
def home
if logged_in?
@car = current_user.cars.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
这就是为什么它适用于家庭。用户/show controller需要类似以下内容:
def show
#don't forget to put whatever other pertinent code goes in this controller
if logged_in?
@feed_items = a_user_you_selected.feed.paginate(page: params[:page])
end
end
希望这能有所帮助。我想你的@feed\u items
收藏是nil
,在nil
上调用\any?
会引起命名错误
如果只有一个有效元素,any?
将返回true,如果所有元素都为nil,它将返回false,如果对象本身为nil
[nil, "car", nil].any?
#=> true
[nil, nil, nil].any?
#=> false
[].any?
#=> false
nil.any?
#=> NoMethodError:
当您渲染用户时,您需要将@feed\u items
作为本地人传递:
<%= render 'users/user', locals: {feed_items: @feed_items} %>
^ instance variable declared in show action
您的提要将如下所示:
<div id="car_feed">
<% if feed_items %>
<ul class="cars">
<%= render feed_items %>
</ul>
<% else %>
<h3> You haven't added any cars yet.</h3>
<h3> Add one in the sidebar!</h3>
<% end %>
</div>
我认为您做错了,您正在通过\any?
检查@feed\u items
是否为空。我们使用#any?
通过传递一个块来检查确定对象属性的条件nil。any?
将引发异常,因为它是可枚举的方法。如果@feed\u items
,您只需通过检查是否存在@feed\u items
。我已删除。有吗?现在,如果@feed\u items
,则逻辑跳过,并显示
部分,即使feed中有项目。这就是你想让我做的吗?你能提高你的@feed\u物品收集量吗,raise@feed\u items。检查并告诉我它显示了什么?你在哪里初始化@feed\u items
?在用户控制器show action中添加@feed\u items
初始化。我在上面添加了我的用户控制器,因为它是使用show
方法引发错误的控制器,并且