3

ユーザーがアカウントを作成しなくても、アプリの特定の機能を利用できるようにしたい - かなり標準的。たとえば、ユーザーがリストを作成して項目を追加できるリスト作成機能があります。この種のことを行うために、コントローラーとビューで current_user を頻繁に使用しています。非ユーザーが試行するたびに、あらゆる種類のエラーが発生することが予想されます。Devise はユーザー属性をセッションに保存し、Cookie で記憶することでこれを処理できることを理解していますよね? 私の質問はこれです: current_user 属性をセッションに保存するにはどうすればよいですか? これと同様の質問についてドキュメントを検索しましたが、あまり運がありませんでした。これがすでにハッシュ化されている場合は、お気軽に適切なリソースに誘導してください (どこかでハッシュ化されていると確信しています)。ここに私のユーザーモデルがあります:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

私がやろうとしていることを明確にできるかどうか教えてください。事前に感謝します!

4

2 に答える 2

1

多くの検索の後、私はこの問題に対する良い解決策を見つけたと思います。guest_users に関する github のデバイス ドキュメントで見つけました。リンクは次のとおりです: https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

deviseが推奨するものは次のとおりです。

class ApplicationController < ActionController::Base

  protect_from_forgery

  # if user is logged in, return current_user, else return guest_user
  def current_or_guest_user
    if current_user
      if session[:guest_user_id]
        logging_in
        guest_user.destroy
        session[:guest_user_id] = nil
      end
      current_user
    else
      guest_user
    end
  end

  # find guest_user object associated with the current session,
  # creating one as needed
  def guest_user
    # Cache the value the first time it's gotten.
    @cached_guest_user ||= User.find(session[:guest_user_id] ||= create_guest_user.id)

  rescue ActiveRecord::RecordNotFound # if session[:guest_user_id] invalid
     session[:guest_user_id] = nil
     guest_user
  end

  private

  # called (once) when the user logs in, insert any code your application needs
  # to hand off from guest_user to current_user.
  def logging_in
    # For example:
    # guest_comments = guest_user.comments.all
    # guest_comments.each do |comment|
      # comment.user_id = current_user.id
      # comment.save!
    # end
  end

  def create_guest_user
    u = User.create(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(99)}@example.com")
    u.save!(:validate => false)
    session[:guest_user_id] = u.id
    u
  end

end

これは良い解決策だと思います。current_user を使用するアプリの一部を作り直し、guest_user と current_user の両方を受け入れるように作り直す必要があります。

于 2013-11-13T23:19:51.027 に答える
1

私はあなたの懸念を理解しています。多くの機能がそれに依存している場合、 current_user を見逃すのは不便です。

最初のステップは、どのような状況でも current_user を作成することです。

class ApplicationController

  def current_user
    super || User.new
  end

end

この設定により、Devise で利用可能な current_user がない場合、この訪問者のために User の新しいインスタンスを自動的に作成します。

2 番目のステップでは、current_user の情報を通常どおりセッションに保存できます。私はセッションの大ファンではありませんが、本当に必要な場合にはまだ使用されています。

于 2013-11-11T07:04:26.007 に答える