Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何显示在线用户_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 如何显示在线用户

Ruby on rails 如何显示在线用户,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我正在写一个简单的聊天,我需要列出在线用户。我不使用designe进行身份验证,有一个定制的user模型,它通过omniauth进行身份验证 user.rb class User < ActiveRecord::Base has_many :messages, dependent: :delete_all class << self def from_omniauth(auth) provider = auth.provi

我正在写一个简单的聊天,我需要列出在线用户。我不使用
designe
进行身份验证,有一个定制的
user
模型,它通过
omniauth
进行身份验证

user.rb

class User < ActiveRecord::Base
    has_many :messages, dependent: :delete_all
    class << self
        def from_omniauth(auth)
            provider = auth.provider
            uid = auth.uid
            info = auth.info.symbolize_keys!
            user = User.find_or_initialize_by(uid: uid, provider: provider)
            user.name = info.name
            user.avatar_url = info.image
            user.profile_url = info.urls.send(provider.capitalize.to_sym)
            user.save!
            user
        end
    end
end
def current_user
    @current_user ||= User.find_by(id: cookies[:user_id]) if cookies[:user_id]
end
helper_method :current_user
我试着这样做:添加到
application\u controller.rb
a
show\u online
方法:

def show_online
    @users = User.where(status: online)
end

helper_method :online_users
然后添加到视图中:

<%= online_users.each do |user| %>
<ul>
    <li><%= user.name %></li>
</ul>
<%end%>

但是它抛出了一个异常
ActionView::Template::Error(未定义的方法“online#u users”)

这里

编辑

对于我来说,我找到了最好的解决方案,但我完全不知道如何正确地实现它:(但这确实是我需要的它应该是
而不是

或在控制器中

def show_online
  @users = User.where(status: 'Online')
end



为什么我从错误消息中选择

,似乎您的@用户不是数组或ActiveRecord::Relation

我会在视图上打印@users以进行调试。另外,
find(:all,:conditions=>[“status=?”,“online”])
不是最好的查询方式

使用
User.where(:status=>“online”)
。参考-

编辑: 您得到的错误可以通过两种方法之一解决。
您可以使用helper方法并从视图中调用它们,就像您想做的那样。
或者,您可以避免完全使用它们,只需在加载视图时从当前使用的任何方法调用show_online方法即可。如果要转到
show
,则将使用show方法,依此类推

您自己的答案确实使用第一种方法正确地修复了错误,但我建议使用这种方法

实施这些修复程序需要做什么:

  • 加载
    new
    时,调用show_online,以便视图可以访问@users变量。我们可以使用before_action

  • 在视图中,您有一个循环,它迭代
    在线用户
    ,但它应该迭代
    @users


  • 在视图中的同一循环中,您有一个简单的语法错误。第一行以
    开头。您的应用程序控制器代码错误:

    class ApplicationController < ActionController::Base
      def show_online
        @users = User.where(status: 'online')
      end
      helper_method :online_users
    end
    
    class ApplicationController
    应该是:

    class ApplicationController < ActionController::Base
      def online_users
        @users ||= User.where(status: 'online')
      end
      helper_method :online_users
    end
    
    class ApplicationController
    可能是
    用户。查找(:all,:conditions=>[“status=?”,“online”])
    返回nil这就是为什么。请不要引用我的话,但我很确定您使用的查找语法很久以前就被删除了。同时提供一条正确的错误消息。它应该告诉您什么对象没有每个方法,这将有助于调试。@2调用混乱它返回
    ActionView::Template::error(nil:NilClass的未定义方法'each')
    @AlexNikolaev94这是因为find方法需要一个ID来查找一条记录(我猜您没有ID
    :all
    )。请在此处查阅文档。您是否查看我的帖子?您是否使用了我提到的@AlexNikolaev94可能会停止打印数组,但与错误无关。如果使用User.where,则不需要if语句。它将返回空数组
    []
    如果没有人在线。@RajarshiDas得到了它,用于
    user.name
    。仍然没有帮助:(那么调试的结果是什么?相同的错误?和类if
    @users
    ?谢谢。几个错误:1.我想你的意思是
    @online\u users
    不是
    online\u users
    。2.更改
    @users=user.where(状态:online)
    @online\u users=User.where(状态:“在线”)
    。此外,我建议您在视图中添加
    ,以查看它是什么类。谢谢!但我实际上没有正确的
    show
    方法-当前用户的
    方法必须嵌套在其中?@AlexNikolaev94您可以从加载视图的任何方法调用show\u online方法,它不必是show方法d、 视图文件的名称是什么?这将告诉我们需要什么方法。我刚刚按照您所说的做了-
    ,现在它返回我
    ActionView::Template::Error(未定义的方法'each'表示nil:NilClass)
    。当我在回答中这样做时,没有出现错误,但在线用户没有显示在列表中。视图文件的名称是什么?现在有一个
    NoMethodError(未定义的方法“show_online”for#)
    正确,但这是他询问的问题。其他问题与异常无关。
    <% @users.each do |user| %>
    <ul>
        <li><%= user.try(:name) %></li>
    </ul>
    <%end%>
    
    #put this line at the top of the controller, just below the line ApplicationController:: .....
    before_action :show_online, only: [:new]
    
    def show_online
        @users = User.where(online: true)
    
    <% @users.each do |user| %>
      <ul>
          <li><%= user.name %></li>
      </ul>
    <% end %>
    
    class ApplicationController < ActionController::Base
      def show_online
        @users = User.where(status: 'online')
      end
      helper_method :online_users
    end
    
    class ApplicationController < ActionController::Base
      def online_users
        @users ||= User.where(status: 'online')
      end
      helper_method :online_users
    end