我有一个帮助程序,用于检查用户是否已登录:
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
我很难过,找不到与此特定主题相关的任何帖子。我虽然是新手。我是以错误的方式问这个问题吗?
提前致谢。
答案 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
时,不断被抛出。在其他情况下,我可以重定向,但我希望用户在登录时看到主页上的动态内容,如果不是,则希望看到静态登录页面。
感谢大家的帮助!