2
Post: hidden: boolean

ログインしたユーザーがすべての投稿を表示できるようにし、ログインしていないユーザーは非表示フィールドがfalseの投稿にのみアクセスできるようにします。だから私はcancanの能力モデルでこのように書いています:

if user_signed_in?
    can :read, Post
else 
    can :read, Post, :hidden => false
end

ただし、モデルではヘルパーuser_signed_inへのアクセスは許可されていません。この質問で述べられているように:Rails 3が考案しましたが、モデルではcurrent_userにアクセスできませんか?。ヘルパーにアクセスするためにいくつかのトリックを使用することはできますが、それを行うのは適切ではありません

では、ログインしていないユーザーを適切に認証するにはどうすればよいですか?または、「含める」を使用してこのヘルパーを使用しますか?

それとも、これを認証部分に入れる必要がありますか?しかし、どのように?

4

1 に答える 1

4

あなたがする必要があるのはこれだけです:

def initialize(user)
  user ||= User.new # guest user (not logged in)

  can :read, Post, :hidden => false

  if User.exists?(user)
    can :read, Post
  end
end

devise では、current_userヘルパー メソッドはログインすると現在のユーザーを返しますが、ログインしていない場合は nil を返します。コントローラーとビューで使用できます。デフォルトでは、CanCan はcurrent_userメソッドの戻りに対してすべての承認チェックを行います。

メソッドがビューまたはコントローラから呼び出されるたびにcan?、 の戻り値がの新しいインスタンスにローカル変数としてcurrent_user渡されます。Abilityuser

ユーザーがログインしているかどうかを確認するには、User.exists?(). そのオブジェクトがデータベースに永続化されているActiveRecord::Baseかどうかを確認するためのクラス メソッドです。userただし、他の方法でも同様に機能します。たとえば、これは同じかそれ以上に機能します。

if user.encrypted_password
  can :read, Post
end

これにより、インスタンスのデフォルトのデバイス パスワード フィールドが存在するかどうかがチェックされuserます。あまりクレイジーなことをしていない場合、これはユーザーがログインしている場合にのみ値を返します。2番目のオプションが状況に適している場合は、データベースにクエリを実行する必要さえないため、優れている可能性があります。

準関連のヒント、Rolifyのような役割を処理する gem をチェックしてください。CanCanと組み合わせて使用​​すると素晴らしいです。

于 2013-02-01T03:46:13.457 に答える