更新
我已经进一步澄清了我的问题,列在这篇文章的末尾。
问题总结:
我正在尝试通过包含令牌身份验证的电子邮件 URL 在 Devise 中实现惰性(又名软注册)注册。在我的网站上,aUser
has_many :payments
和 a Payment
belongs_to :user
。当 aUser
创建一个 new时,它包含代表一个新的非注册用户(我称之为“Guest”)Payment
的属性。:email
我使用 ActionMailer 向这位新访客发送电子邮件。
在发送的这封电子邮件中,我想包含一个带有令牌身份验证的 URL(例如http://localhost/index?auth_token=TOKENVALUE
),以便访客可以查看和编辑需要身份验证的视图并专门为其定制(基于他们的:email
)。客人还应该能够注册为User
- 因为我已经有了他们的电子邮件地址,他们只需要提供密码。
到目前为止我的进展:
- 我已经实现了某人使用 Devise 注册网站的能力,并创建了相关的视图、模型和控制器来更改我的
Payment
模型 - 我已经设置了 ActionMailer 并正在使用它来发送电子邮件,但还没有设置令牌身份验证,因为鉴于上面的用例,我不确定如何设置
相关资源:
- https://github.com/plataformatec/devise/wiki/How-To:-Simple-Token-Authentication-Example
- http://zyphdesignco.com/blog/simple-auth-token-example-with-devise
- 使用 Ruby On Rails 的多个用户模型,并设计有单独的注册路线,但只有一个共同的登录路线
- 如何在 Rails 3 + Devise 中创建访客用户
- https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user
- http://blog.bignerdranch.com/1679-lazy-user-registration-for-rails-apps/
- http://railscasts.com/episodes/393-guest-user-record?view=asciicast
- https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface
- Rails 3 - Devise Gem - 如何通过 CRUD 界面管理用户
- http://danielboggs.com/articles/rails-authentication-and-user-management-via-crud/
/app/models/payment.rb
class Payment < ActiveRecord::Base
attr_accessible :amount, :description, :email, :frequency, :paid, :user_id
belongs_to :user
validates :email, :presence => true, :format => { :with => /.+@.+\..+/i }
validates :amount, :presence => true
validates :description, :presence => true
end
/app/models/user.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
# I will also need to add ":token_authenticatable"
attr_accessible :email, :password, :password_confirmation, :remember_me
has_many :payments
end
问题:
- 如何使我的表与创建
User
的新表保持同步,以便表中创建的Payments
任何新表都会自动添加到表中?:email
Payment
User
:email
- 从问题 1 开始,新
User
创建的应包含令牌但不包含密码,因为用户尚未注册该站点。我应该User
使用空白密码、随机生成的字符串还是其他方式创建新密码?在任何一种情况下,我认为他们都需要从他们的令牌认证 URL 进入注册页面,以防止其他人使用他们的电子邮件用户名注册(例如懒惰注册) - 从问题 2 开始,我认为我需要区分访客和普通用户,因为某些视图会根据用户类型而变化。除了添加一个具有 0 或 1 的列来划分两种用户类型之外,还有其他首选方法吗?
如果可能的话,我的首选是使用 Devise,因为我正在使用其中的许多功能。我是 RoR 的新手,感谢您提供的任何建议!
编辑:这是我用来解决上述问题 #1 的代码,在我的支付控制器中,以防对其他人有帮助
def create
@payment = current_user.payments.build(params[:payment])
#Here is the code I added to keep User :email in sync with Payment :email, without token authentication implemented yet
unless User.find_by_email(params[:payment][:email].downcase)
u = User.new({:email => params[:payment][:email].downcase, :password => nil, :password_confirmation => nil })
u.skip_confirmation!
u.save(:validate => false) #skip validation
end
respond_to do |format|
if @payment.save
format.html { redirect_to payments_url, :flash => { notice: 'Payment was successfully created.' } }
format.json { render json: @payment, status: :created, location: @payment }
else
format.html { render action: "new" }
format.json { render json: @payment.errors, status: :unprocessable_entity }
end
end
end