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
ashow\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方法,依此类推
您自己的答案确实使用第一种方法正确地修复了错误,但我建议使用这种方法
实施这些修复程序需要做什么:
- 加载
时,调用show_online,以便视图可以访问@users变量。我们可以使用before_actionnew
- 在视图中,您有一个循环,它迭代
,但它应该迭代在线用户
@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
返回nil这就是为什么。请不要引用我的话,但我很确定您使用的查找语法很久以前就被删除了。同时提供一条正确的错误消息。它应该告诉您什么对象没有每个方法,这将有助于调试。@2调用混乱它返回用户。查找(:all,:conditions=>[“status=?”,“online”])
@AlexNikolaev94这是因为find方法需要一个ID来查找一条记录(我猜您没有IDActionView::Template::error(nil:NilClass的未定义方法'each')
)。请在此处查阅文档。您是否查看我的帖子?您是否使用了我提到的@AlexNikolaev94可能会停止打印数组,但与错误无关。如果使用User.where,则不需要if语句。它将返回空数组:all
如果没有人在线。@RajarshiDas得到了它,用于[]
。仍然没有帮助:(那么调试的结果是什么?相同的错误?和类ifuser.name
?谢谢。几个错误:1.我想你的意思是@users
不是@online\u users
。2.更改online\u users
至@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