0

所以我有这个任务,我应该输出当前登录用户最近五次登录的列表。

所以像这样:

个人 A 于 2012 年 12 月 12 日 12.00 登录。

个人 A 在 2013 年 12 月 1 日 12 点再次登录。

等等。

这需要最多五个列表,一旦达到该限制,第一次登录(在这种情况下为 12.00 12/12/12)将被排除在视图之外。

到目前为止,我所拥有的是一个登录系统,其中包含记住令牌和登录本身的一些简单授权(从头开始并回到 Michael Hartl 的教程中的一些细节)。现在,我可以列出用户登录的当前时间,但不能列出以前的“版本”。

所以,这是我的观点:

<% if signed_in? %>
<h1>Welcome, <%= current_user.name %>!</h1>
<p>You were last logged in on:</p>
<ul>
    <li><%= current_user.lastlogin %></li>
</ul>
<%= link_to "Sign out", signout_path, method: "delete", class: "btn btn-large" %>
<% else %>
... (state for non logged in users)
<% end %>

这是我的用户类:

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :lastlogin
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  ...(validation following this)

这是我的 session_controller

class SessionsController < ApplicationController
def new
end

def create
user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_to root_path
else
        flash.now[:error] = 'Invalid email/password combination'
    render 'new'
  end
end

这里我们有 sign_in 函数

module SessionsHelper
 def sign_in(user)
 # user.update_attribute(:lastlogin, Time.now)
   user.touch(:lastlogin)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
 end
end

我正在寻找有关如何解决此问题的想法。

另一件我忘了提的是,视图层需要在一定程度上进行修改,以便循环遍历五个登录时间并按顺序输出,而不是在五个列表项中进行硬编码。

我正在考虑的一件事是在一个表之间建立一个关系,该表具有与一个用户对应的五个字段。然后在登录(或注销)时获取 :lastlogin 值并将其推送到表中的字段中。

然后,当所有字段都填写完毕后,查看第一个日期并将其替换为新日期。

所以我在想的是

def sign_in
  user.touch(:lastlogin)
  # push :lastlogin value into field in LoginsTable
  cookies.permanent[:remember_token] = user.remember_token
  self.current_user = user
end

我对 Ruby on Rails 很陌生,可能离这里很远。我已经尝试搜索像我在这里解释的那样的功能,而我得到的只是各种插件/完整的 gem 来处理这个以及在身份验证等方面的所有其他事情,这并不是真的在这种情况下“需要”,因为这对我自己来说只是一个小时间项目。

干杯!

编辑:

推入 user_logins 表的徒劳尝试。

module SessionsHelper
  def sign_in(user)
    user.update_attribute(:lastlogin, Time.now)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
    login_time = UserLogins.create(:login_time Time.now, :user_id current_user)
  end
end

现在这显然行不通。我不太确定如何在视图层中循环访问 login_times。但我认为我最终会让它工作,现在你让我走上了正确的轨道:)

4

3 回答 3

1

如果您硬编码 5 个字段来保存最近 5 个登录日期,那么您将陷入混乱,而不是考虑使用一个表来存储所有用户的登录历史记录。一个简单的表“user_logins”和,id就足够了。每次用户登录时写入此表,然后在您的视图中只需选择按降序排列的前 5 个结果。user_idlogin_timelogin_time

希望这是有道理的!

于 2013-01-16T17:01:34.633 回答
1

在这条线上

login_time = UserLogins.create(:login_time Time.now, :user_id current_user)

您正在创建错误的哈希对象。Ruby 1.9 哈希语法是

some_var: "some value" 

不是

:some_var "some value"

祝你好运!

还要稍微分解一下 UserLogins 对象。由于您使用的是 Time.now,因此让 UserLogins 对象设置时间,从而将您的方法简化为单一方法。

旁注:

您不应该将 Model 对象命名为复数,因为这在 Rails 中会让人感到困惑。

于 2013-01-16T18:17:04.607 回答
0

我更喜欢使用 devise gem,因为它可以维护身份验证以及用户登录历史记录,因此您可以轻松获取最后五个登录用户,在用户模型上应用查询并通过最后一次登录订购 desc

于 2013-01-17T09:07:12.147 回答