0

http://railscasts.com/episodes/250-authentication-from-scratchをいじっていて、少しリファクタリングしようとすると問題が発生しました。

アプリは、次のように設定するだけでユーザーをログインさせます。

session[:user_id] = user.id 

現在、これはコントローラーにあります。User オブジェクトに 2 つのメソッドが必要です。1 つはログインと呼ばれ、もう 1 つはログアウトと呼ばれます。つまり、ログインの実装を変更すると、コードを変更する場所が 1 つだけになり、コードが少し読みやすくなります。最も簡単な解決策は、明らかにこれをユーザー モデルに追加することです。

def login
  session[:user_id] = user.id
end

誰もが知っているように、Rails モデルではセッションにアクセスできません。もちろん、アプリケーション コントローラーで 2 つのメソッドを作成してユーザー オブジェクトを渡すこともできますが、これは少し見苦しく思えます。この単純なユースケースを実現するための推奨される方法は何ですか?

4

3 に答える 3

0

推奨される方法は、モデルにそのようなコードを入れないことです。

これは実際の質問には答えていませんが、モデル内でこれを実装するための推奨される方法はありません。モデルはデータベースへのアクセスのみを目的としており、http セッションとの対話には使用しないでください。

「current_user」を認識して維持することは、(MVC パターン内の) コントローラーの明確な責任です。

于 2012-08-23T14:47:53.563 に答える
0

1 つのオプションは、ユーザーにログイン/ログアウトを実行できるクラス、クラス インスタンス、またはプロシージャを与えることです。

ユーザー クラスは、クラス メソッド/プロシージャを呼び出すだけで済みます。ログイン/ログアウトがどのように発生するかに関するすべての詳細は、クラス/プロシージャにカプセル化されています。

これにより、Rails からログイン/ログアウトのアイデアも分離されるため、GUI アプリ (JRuby/Swing など) またはコマンドライン アプリから同じモデルを使用できます。それがどれほど簡単/難しいかは、モデルによっても異なります。

于 2012-08-23T14:56:21.617 に答える
0

おそらく、モデルで例外を発生させ、rescue_from を使用してコントローラーでキャッチすることができます。CanCanで行うことと同様です。

于 2013-05-15T02:10:46.033 に答える