3

我希望用户能够使用我的应用程序的某些功能而无需创建帐户 - 非常标准。例如,我有一个列表制作功能,用户可以在其中创建列表并向其中添加项目。我在我的控制器和视图中大量使用 current_user 来执行此类操作,并且每当非用户尝试时,它都会抛出各种错误。我知道 Devise 可以通过在会话中存储用户属性然后用 cookie 记住来处理这个问题,对吗?我的问题是:如何在会话中存储 current_user 属性?我已经搜索了有关此和 SO 的类似问题的文档,但运气不佳。如果这已经被散列出来,请随时将我引导到一个好的资源(我确信它已经在某个地方)。这是我的用户模型:

class User < ActiveRecord::Base

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

请让我知道我是否可以澄清我正在尝试做的事情,并提前感谢!

4

2 回答 2

1

我理解你的担心。当许多功能依赖于它时,错过 current_user 很不方便。

第一步是在任何情况下创建一个 current_user。

class ApplicationController

  def current_user
    super || User.new
  end

end

通过此设置,当 Devise 中没有可用的 current_user 时,您会自动为该访问者创建一个新的 User 实例。

第二步,您现在可以像往常一样将 current_user 的信息存储到会话中。我不是 session 的忠实粉丝,但当你真正需要它时它仍然有用。

于 2013-11-11T07:04:26.007 回答
1

经过大量搜索,我想我已经找到了解决这个问题的好方法。我在 github 上关于 guest_users 的设计文档中找到了它。这是链接:https ://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

以下是设计建议:

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 回答