最近、RailsアプリケーションにDeviseをインストールしましたが、他のモデルまたはコントローラーのいずれかで現在ログインしているユーザーのインスタンスを取得できるかどうか疑問に思っています。だから、どうすればいいのですか?
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?
」に置き換えられました
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
を使用します。
簡単な方法は次のとおりです。
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つのアイデアは、Thread.current[:current_user] = @current_user
をbefore_filterとして使用することですが、Thin + EM_Mysql2 + Rack :: FiberPoolのようなデプロイメントスタックを使用している場合は、Fiber.current[:current_user]
に設定する必要があります。
これらのソリューションは、実際には優れた設計ロジックの欠如を隠蔽しています。