用户的last_online属性仍然是`nil`

时间:2016-04-16 18:44:32

标签: ruby-on-rails ruby

我正在建立一个小型的实时聊天,而且我坚持在网上列出用户。我有一个自定义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错误,但仍然没有在线用户在我看来:(

2 个答案:

答案 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的声明。