使用Devise的匿名用户?

问题描述 投票:5回答:5

如果我想用 rails 建立一个聊天室(标准情况下),可以选择匿名('取个昵称')和授权(un & pw),如何用 Devise 建立?

我已经成功地让Devise在后一种情况下工作了,我正在努力解决匿名部分(创建& 维护会话)。

ruby-on-rails devise
5个回答
5
投票

例如,使用额外的before_filter来设置匿名用户。

def anonymous_sign_in
  return if user_signed_in?
  u = User.new(:type => 'anonymous')
  u.save(:validate => false)
  sign_in :user, u
end

8
投票

其实有一个Devise Wiki页面,只是他们称之为Guest用户。

如何创建一个访客用户


4
投票

另一种选择是不签入访客用户,但在没有签入用户的情况下,让current_user返回一个访客用户。

在下面的代码中,如果用户没有登录,那么 current_user 将返回一个访客用户。所以,任何可以在不登录的情况下访问的控制器都不需要使用 authenticate_user! 前的过滤。

def current_user                                                              
  super || guest_user                                                         
end                                                                           

def guest_user                                                                
  User.find(session[:guest_user_id].nil? ? session[:guest_user_id] = create_guest_user.id : session[:guest_user_id])
end                                                                           

def create_guest_user                                                         
  token = SecureRandom.base64(15)                                             
  user = User.new(:first_name => "anonymous", :last_name => 'user', :password => token, :email => "#{[email protected]}")
  user.save(:validate => false)                                               
  user                                                                        
end   

1
投票
#user.rb
    # Creates an anonymous user. An anonymous user is basically an auto-generated
    # +User+ account that is created for the customer behind the scenes and its
    # completely transparently to the customer.
    def anonymous!(nickname)
      temp_token = SecureRandom.base64(15).tr('+/=', 'xyz')
      usr = ::User.new(email: "#{temp_token}@example.net", password: temp_token, password_confirmation: temp_token, nickname: nickname)
      usr.save!(validate: false)
      usr
    end

然后你可以在合适的时候删除记录。


0
投票

这是我在Rails 6中的做法。

class ApplicationController < ActionController::Base
  before_action :anonymous_sign_in

  def anonymous_sign_in
    return if user_signed_in?

    u = User.new(:name => 'anonymous')
    u.save(:validate => false)
    sign_in :user, u
  end
end

从默认的devise生成的模型中, 我已经删除了电子邮件的默认和null约束, 并添加了名称。

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :email
      t.string :name

      ## Database authenticatable
      # t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      # ...
© www.soinside.com 2019 - 2024. All rights reserved.