0

したがって、現在ログインしているユーザーによる最後の5回のログインのリストを出力することになっているこのタスクがあります。

だからこのように:

人物Aは12.0012/12/12にログインします。

人物Aは12.0012/01/13に再度ログインします。

等々。

これは5つのリストまで機能する必要があります。その制限に達すると、最初のログイン(この場合は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)

そしてこれは私のsessions_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

この問題に取り組む方法についてのアイデアを探しています。

私が言及するのを忘れたもう1つのことは、5つのリスト項目でハードコーディングするのではなく、5つのログイン時間をループして順番に出力するようにビューレイヤーをある程度変更する必要があるということです。

私が考えていることの1つは、1人のユーザーに対応する5つのフィールドを持つテーブル間の関係を設定することです。次に、サインイン(またはサインアウト)時に: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

私はRubyonRailsにまったく慣れていないので、ここから離れているかもしれません。ここで説明しているような機能を検索してみましたが、認証などに関しては、これと他のすべてを処理するさまざまなプラグイン/完全な宝石だけが得られましたが、実際にはそうではありませんこの場合、それは私にとってほんの小さな時間のプロジェクトであるため、「必要」です。

乾杯!

編集:

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つのフィールドをハードコーディングすると、厄介な問題に巻き込まれます。代わりに、すべてのユーザーのログイン履歴を格納するテーブルを用意することを検討してください。iduser_idを含む単純なテーブル「user_logins」でlogin_time十分です。ユーザーがログインするたびにこのテーブルに書き込み、ビューで上位5つの結果をlogin_time降順で選択します。

それが理にかなっていることを願っています!

于 2013-01-16T17:01:34.633 に答える
1

この行に

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

ハッシュオブジェクトを間違って作成しています。Ruby1.9ハッシュ構文は

some_var: "some value" 

いいえ

:some_var "some value"

幸運を!

また、そのUserLoginsオブジェクトを少し分解します。Time.nowを使用しているので、UserLoginsオブジェクトに時間を設定させて、メソッドを単調なものに減らします。

サイドノート:

Railsで混乱するため、Modelオブジェクトに複数形の名前を付けないでください。

于 2013-01-16T18:17:04.607 に答える
0

私はdevisegemを使用することを好みます。これは、認証とユーザーログインの履歴を維持するため、ユーザーモデルにクエリを適用する最後の5つのログインユーザーを簡単に取得し、最後のログインで説明を注文することができます

于 2013-01-17T09:07:12.147 に答える