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
方法引发错误的控制器,并且