使用if条件语句的未定义方法错误

时间:2012-09-17 21:50:00

标签: ruby-on-rails ruby

我有一个帮助程序,用于检查用户是否已登录:

def signed_in?
  !current_user.nil?
end

我还有一个帮助程序,允许视图和控制器通过检查会话来访问用户对象:

def current_user
  @current_user ||= User.find_by_session(session[:user_id])
end

在我的一个控制器中,它可以正常拉出用户对象

  def index
    @households = current_user.households.all
    @household = current_user.households.build

    respond_to do |format|
      format.html
      format.xml { render xml: @households }
    end
  end

然而,另一个控制器在尝试调用住户关系时阻塞了current_user帮助程序:

def home
  @households = current_user.households.all
  @household = current_user.households.build

  respond_to do |format|
    format.html
    format.xml { render xml: @households }
  end
end

错误:

undefined method `households' for nil:NilClass

我很难过,找不到与此特定主题相关的任何帖子。我虽然是新手。我是以错误的方式问这个问题吗?

提前致谢。

4 个答案:

答案 0 :(得分:1)

尝试将模块包含在第二个控制器中。

例如,辅助模块如下所示:

module UserHelper
  def current_user
    @current_user ||= User.find_by_session(session[:user_id])
  end
end

然后将其包含在您的控制器中:

class YourController < ApplicationController
  include UserHelper

  def home
    @households = current_user.households.all
    @household = current_user.households.build

    respond_to do |format|
      format.html
      format.xml { render xml: @households }
    end
  end
end

答案 1 :(得分:1)

问题不在于current_user帮助方法对第二个控制器不可用,而是你的current_user方法没有找到用户并返回nil。然后你试图在返回的nil对象上调用household方法。

如果current_user方法在该控制器中不可用,您将看到错误消息,例如:

undefined local variable or method `current_user' for #<YourController:0x1057870e8>

这意味着您的逻辑流程存在缺陷。会话参数在到达该方法时尚未设置,或者已设置,但已设置为不存在的user_id。

尝试添加:

def home
  @households = (logged_in? ? current_user.households.all : nil)
  @household  = (logged_in? ? current_user.households.build : nil)

  respond_to do |format|
    format.html
    format.xml { render xml: @households }
  end
end

用你的后备数据取代nil。

答案 2 :(得分:1)

可能刚刚发现为什么你的current_user方法返回nil。您按会话而非ID搜索。试试这个:

def current_user
  @current_user ||= User.find(session[:user_id])
end

或者如果你想更明确:

def current_user
  @current_user ||= User.find_by_id(session[:user_id])
end

答案 3 :(得分:0)

我讨厌跳到这里回答我自己的问题,但是我很难解决这个问题,所以我希望任何有同样问题的人能够解决这个问题。   这结果是本页上许多答案的混合以及Michael Hartl的教程书。   我正在使用帮助方法,但没有在application_controller.rb中包含帮助程序:

class ApplicationController < ActionController::Base
  include ControllerAuthentication
  include SessionsHelper
...

我还在验证用户是否已登录以在我的视图home.html.erb中显示动态内容:

<% if signed_in? %>
  <!-- show the user dashboard -->
...

但我在控制器static_pages_controller.rb上没有这样的验证:

def home
  if signed_in?
  @households = current_user.households.all 
  @household  = current_user.households.build 
end

由于所有这些,错误:

undefined method `households' for nil:NilClass
当用户未登录并尝试访问root_path时,

不断被抛出。在其他情况下,我可以重定向,但我希望用户在登录时看到主页上的动态内容,如果不是,则希望看到静态登录页面。

感谢大家的帮助!