【问题标题】:Why am I getting a No Method and Nil Object error in the following line of codes?为什么在以下代码行中出现 No Method 和 Nil Object 错误?
【发布时间】:2011-08-24 05:46:00
【问题描述】:

我正在尝试在rails上的index.html.erb中实现以下代码,服务器上出现以下错误:

用户中的 NoMethodError#index 当你没想到时,你有一个 nil 对象! 您可能期望有一个 Array 的实例。 评估 nil.each 时发生错误

提取的源代码(第 2 行附近)

<div id="users">  
  <% @users.each do |user| %>  
<div id="user">  
      <% if user.username != current_user.username %>  
        <%=h user.username %>  
        <%= link_to "Add Friend", friendships_path(:friend_id => user), :method => :post %>  
      <% end %>  
    </div>  

  <% end %>  
</div>  

控制器代码:

    class UsersController < ApplicationController

  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      session[:user_id] = @user.id
      redirect_to root_url, :notice => "Thank you for signing up! You are now logged in."
    else
      render :action => 'new'
    end
  end
  end

  def edit
    @user = current_user
  end

  def update
    @user = current_user
    if @user.update_attributes(params[:user])
      redirect_to root_url, :notice => "Your profile has been updated."
    else
      render :action => 'edit'
    end
  end

【问题讨论】:

    标签: ruby-on-rails authentication erb null nomethoderror


    【解决方案1】:

    你会在 Rails 中得到很多。
    解释: 该方法确实存在,因此错误消息令人困惑。问题是变量 (@users) 没有任何值。它是 nil 而不是有效的对象。因此,当您尝试在“nil”上调用该方法时,您会收到该错误消息。 因此,请查看您的控制器并确保查询例如@users = User.all 实际上会返回记录,您也可以在控制台(脚本/控制台或脚本/rails 控制台)中检查它

    【讨论】:

      【解决方案2】:

      您在 @users 变量上调用 .each,但 @users 为 nil。

      如果您需要其他帮助,请发布您的控制器代码。

      如果你想纠正这个观点,你可以这样做:

      <% if @users %>
        <div id="users">  
          <% @users.each do |user| %>  
           <div id="user">  
            <% if user.username != current_user.username %>  
              <%=h user.username %>  
              <%= link_to "Add Friend", friendships_path(:friend_id => user), :method => :post %>  
            <% end %>  
          </div>  
      
          <% end %>  
        </div>
      <% end %>  
      

      【讨论】:

      • 一种稍微不同的方法是确保@users 总是返回一个Array,即使它是空的[] 然后你可以省略检查并且你不会被其他地方也犯了同样的错误。
      • @Paul.s 好主意,这就是我想看到控制器的目的。
      • @Paul.s 我在控制台上运行了@users,结果为零。我跑了@users = User.all,它返回了[],这是一个好兆头。你们是救生员。
      • 托尼,我看了看,似乎根本没有提到@users。
      猜你喜欢
      • 2023-01-05
      • 2013-09-22
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2013-09-04
      • 2013-10-20
      相关资源
      最近更新 更多