用户模型上的Ruby-rails-NoMethodError
我得到了当前用户id的用户模型上的Ruby-rails-NoMethodError,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我得到了当前用户id的NoMethodError。下面是我的用户模型表。我不知道这个错误是什么意思,因为当前的用户id存在。是什么导致了这个问题?我在这里迷路了。就我所记得的,我没有犯这个错误,我不断地给项目添加新的东西,结果在某个地方我搞砸了。虽然我在做与用户模式无关的更改。如果存在当前的用户id,为什么命名错误之后?不知所措和困惑 错误- Started GET "/item/list" for 10.10.10.10 at 2012-05-01 23:19:19 -0400 Process
NoMethodError
。下面是我的用户模型表。我不知道这个错误是什么意思,因为当前的用户id存在。是什么导致了这个问题?我在这里迷路了。就我所记得的,我没有犯这个错误,我不断地给项目添加新的东西,结果在某个地方我搞砸了。虽然我在做与用户模式无关的更改。如果存在当前的用户id,为什么命名错误之后?不知所措和困惑
错误-
Started GET "/item/list" for 10.10.10.10 at 2012-05-01 23:19:19 -0400
Processing by Item#list as */*
Completed 500 Internal Server Error in 0ms
NoMethodError (undefined method `user_id' for nil:NilClass):
app/controllers/Item_controller.rb:52:in `list'
用户模型表-
mysql> explain users;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
使用当前用户id的项目控制器-
def list
@mylist = Item.find(:all, :select => 'item_num', :conditions => { :id => current_user.user_id, :item_status => ["New"]} )
respond_to do |format|
format.html { render :partial => 'item_list'}
format.js
end
return @mylist
end
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def debug
render :text => current_user.user_id #prints correct user_id
end
当您尝试调用
user\u id
时,错误消息告诉您current\u user
设置为nil
。我无法告诉您,根据您包含的代码,current\u user
为什么是nil
,但如果您可以跟踪当前用户如何分配用户,您就会发现问题所在。它与您的数据库没有任何关系。错误消息告诉您,当您尝试调用用户id
时,当前用户
设置为nil
。我无法告诉您,根据您包含的代码,current\u user
为什么是nil
,但如果您可以跟踪当前用户如何分配用户,您就会发现问题所在。它与您的数据库无关。问题似乎不是您的用户模型没有响应方法User\u id,而是根据错误消息,方法current\u user
返回nil,并且nil不响应用户id。因此,原因可能是即使没有任何用户登录,您也调用了此操作
解决此问题的一种方法是,在调用用户id之前,首先检查当前用户是否返回了任何内容。可能如下所示:
@mylist = Item.find(:all, :select => 'item_num', :conditions => { :id => (current_user && current_user.user_id), :item_status => ["New"]} )
如果curret_user为nil,它将计算为false,然后不会调用user_id,而是查询id为NULL的项。如果这是你的应用程序的适当行为,我将留给你
另外,您的语法并不是真正的Rails3。我将其改为:
@mylist = Item.select(:item_num).where(:id => (current_user && current_user.user_id), :item_status => ["New"])
问题似乎不是您的用户模型不响应方法User\u id,而是根据错误消息,方法
当前用户
返回nil,而nil不响应User\u id。因此,原因可能是您调用此操作,即使没有任何用户登录
解决此问题的一种方法是,在调用用户id之前,首先检查当前用户是否返回了任何内容。可能如下所示:
@mylist = Item.find(:all, :select => 'item_num', :conditions => { :id => (current_user && current_user.user_id), :item_status => ["New"]} )
如果curret_user为nil,它将计算为false,然后不会调用user_id,而是查询id为NULL的项。如果这是你的应用程序的适当行为,我将留给你
另外,您的语法并不是真正的Rails3。我将其改为:
@mylist = Item.select(:item_num).where(:id => (current_user && current_user.user_id), :item_status => ["New"])
您之所以获得此信息,是因为
当前\u用户
显示为零。您当前的用户功能不符合您的想法,让我们看一下:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
因此,它按以下顺序执行:
会话[:user_id]
,请继续,否则返回nil@current\u user
,则返回@current\u user
;否则继续@current\u user
设置为user.find(会话[:user\u id])
User.find()
如果找不到用户,将引发异常User.find\u by\u User\u id()
只会返回nil
,而不会引发异常。一定要选择你想要的行为
您的方法是正确的,这意味着只要未设置会话[:user\u id]
,您将获得nil
。您只需要在代码中捕捉到这一点。因为nil
是错误的,所以这很容易。在任何ruby代码中:
any_method if current_user
在控制器中,您需要执行以下操作:
def list
if current_user
@mylist = Item.find(:all, :select => 'item_num', :conditions => { :id => current_user.user_id, :item_status => ["New"]} )
respond_to do |format|
format.html { render :partial => 'item_list'}
format.js
end
else
redirect_to login_path, :notice => "You must be logged in to continue."
end
end
注意:(1)在Ruby中,不需要说return
,每个方法的最后一行都会自动返回,(2)Rails控制器方法在重定向或渲染时结束,没有返回
为了使这个更干净,我可能会说你需要一个前过滤器。控制器中的类似内容应该可以实现以下目的:
before_filter :require_login
def require_login
redirect_to login_path, :message => 'You must be logged in to view this page.' unless current_user
end
然后,如果用户尚未登录,则所有方法都会将其重定向到登录位置。也可以使用:only或:except选项仅指定某些方法来使用此筛选器
因为您可能会在整个应用程序中使用该方法,所以您可能会将当前用户
和要求登录
方法移动到您的应用程序控制器
不过,最后一件事是,您的代码和问题反映出您对rails和REST的一些真正基本思想并不熟悉。如果你学会了做事的“Rails方式”,你将真正加快你的发展。一个伟大的,免费的资源,让你的轨道将是迈克尔哈特尔的。你应该努力完成它,你会很高兴你做到了,当你完成后,你会远远领先于现在。你得到了这个,因为
当前用户
是零。您当前的用户功能不符合您的想法,让我们看一下:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
因此,它按以下顺序执行:
会话[:user_id]
,请继续,否则返回nil@current\u user
,则返回@current\u user
;否则继续@current\u user
设置为user.find(会话[:user\u id])
User.find()
如果找不到用户,将引发异常User.find\u by\u User\u id()
只会返回nil
,而不会引发异常。一定要选择你想要的行为
您的方法是正确的,这意味着无论何时会话[:user\u id]
i,您都将获得nil