0

我有一个助手可以检查用户是否登录:

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

我很困惑,找不到与这个特定主题相关的任何帖子。不过,我是 Rails 新手。我是否以错误的方式问这个问题?

提前致谢。

4

4 回答 4

1

问题不在于第二个控制器无法使用 current_user 辅助方法,而是您的 current_user 方法没有找到用户并返回 nil。然后您尝试在返回的 nil 对象上调用家庭方法。

如果 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 替换为您的后备数据应该是什么。

于 2012-09-17T22:22:51.947 回答
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
于 2012-09-17T23:06:07.223 回答
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
于 2012-09-17T22:05:21.580 回答
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. 在其他情况下,我可以重定向,但我希望用户在登录时看到主页上的动态内容,如果未登录,则看到静态登录页面。

感谢大家的帮助!

于 2012-09-18T14:19:42.923 回答