web-dev-qa-db-ja.com

Rails Devise:現在ログインしているユーザーのオブジェクトを取得しますか?

最近、RailsアプリケーションにDeviseをインストールしましたが、他のモデルまたはコントローラーのいずれかで現在ログインしているユーザーのインスタンスを取得できるかどうか疑問に思っています。だから、どうすればいいのですか?

58
GSto

Deviseは、現在ログインしているユーザーを表す便利なメソッドをその場で作成します。

ただし生成されたメソッド名には、ユーザーモデルのクラス名が含まれていることに注意してください。例えばDeviseモデルの名前が「User」の場合、現在ログインしているユーザーは「current_user」でアクセスできます。Deviseクラスが「Admin」の場合はログインします管理ユーザーは「current_admin」でアクセスできます。

同様の規則で作成された他の多くのメソッドがあります。たとえば、 'user_signed_in?'または再び 'admin_signed_in?'です。これらは本当にすてきです。

これらのメソッドはコントローラーとビューで使用できるため、ビューに次のものがある場合があります。

<% if user_signed_in? %>
  <div>Signed in as... <%= current_user.email %></div>
<% end %>

最後に、アプリで2つ以上のDeviseモデル(ユーザーと管理者など)を使用している場合、「anybody_signed_in?」という便利なメソッドを使用して、これらのタイプのユーザーのいずれかがサインインしているかどうかを確認できます。

<% if anybody_signed_in? %>
  <h2>Special offers</h2>
  <p>All registered users will receive free monkeys!</p>
<% end %>

更新:

Deviseバージョン1.2.0以降、「anybody_signed_in?」は廃止され、「signed_in?」に置き換えられました

117
Scott

Deviseヘルパーメソッドは、コントローラーレイヤーとビューレイヤーでのみ使用できます。モデル層では使用できません( [〜#〜] readme [〜#〜] のコントローラーフィルターとヘルパーセクションを参照)。

  • Is it possible to get the currently logged in user from within a model?

Deviseが自動的に作成するデフォルトのヘルパーメソッドでは不可能です。ただし、current_userをモデルに提供するために使用できる多くの代替方法があります。 Alex Bartlowによって既に最も簡単な方法が提案されており、メソッドにcurrent_userをモデルに渡すだけです。

  • Is it possible to get the currently logged in user from within a controllers?

はい、可能です。 current_<modelname>を使用します。<modelname>は、Devise認証機能を備えたモデルの名前です(つまり、Rails g devise <modelname>を使用)。たとえば、モデルがUserの場合、current_userを使用します。モデルがElmoの場合、current_elmoを使用します。

15
John

簡単な方法は次のとおりです。

if @suit.user == current_user

例:

= link_to "Back", root_path, class: "btn btn-default"

  -if @suit.user == current_user

    = link_to "Edit", edit_suit_path, class: "btn btn-default"

    = link_to "Delete", suit_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default"
1
MaximuSSmile

パラメータとしてメソッド呼び出しに渡します:)。

1つのアイデアは、Thread.current[:current_user] = @current_userをbefore_filterとして使用することですが、Thin + EM_Mysql2 + Rack :: FiberPoolのようなデプロイメントスタックを使用している場合は、Fiber.current[:current_user]に設定する必要があります。

これらのソリューションは、実際には優れた設計ロジックの欠如を隠蔽しています。

1
Alex Bartlow