用户模型上的Ruby-rails-NoMethodError

用户模型上的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

我得到了当前用户id的
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