我正在建立一个小型的实时聊天,而且我坚持在网上列出用户。我有一个自定义User
模型,在列出在线用户列表的过程中,我进行了迁移add_last_online_to_users last_online:datetime
。然后,在我的user.rb
:
EDITED
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
def online_now
where("last_online > ?", 15.minutes.ago)
end
end
end
application_controller.rb
中的:
def show_online
@users = User.online_now
end
在sessions_controller.rb
已加入:
def create
user = User.from_omniauth(request.env["omniauth.auth"])
cookies[:user_id] = user.id
user.update_attributes(last_online: Time.now)
end
在messages_controller.rb
已加入:
def create
respond_to do |format|
if current_user
@message = current_user.messages.build(message_params)
@message.save
current_user.update_attributes(last_online: Time.now)
format.html{redirect_to root_path}
format.js
else
format.html{redirect_to root_path}
format.js {render nothing: true}
end
end
end
最后是观点:
<ul>
<%= @users.each do |user| %>
<li><%= user.name %></li>
<% end %>
</ul>
修改
但是当我在登录后检查或在控制台中发送消息时 - 视图中没有列出用户,当我尝试在控制台上调用User.online_now
时,它返回undefined method 'online_now' for User
另一个编辑
我已经告知self
课程中的online_now
方法User
已删除,现在没有undefined method
错误,但仍然没有在线用户在我看来:(
答案 0 :(得分:1)
您似乎没有在sessions_controller.rb中保存last_online属性,只是分配值。相反,试试这个:
def create
user = User.from_omniauth(request.env["omniauth.auth"])
cookies[:user_id] = user.id
user.update_attributes(last_online: Time.now)
end
messages_controller.rb中的相同内容。尝试将current_user.last_online = Time.now
替换为current_user.update_attributes(last_online: Time.now)
答案 1 :(得分:1)
由于您已经使用&#39;类&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;自我&#39;,它可能会导致您将方法定义为自冗余的麻烦。尝试没有&#39; self&#39;关于online_now的声明。