我有一个我在Rails 3.0中使用设计和创建的网站。 cancan安装。该应用程序包含一个只有4000多人的列表,成员可以在其中查看。数据库中很少有人是成员。
有没有办法允许4000人访问只更新他们的个人资料而不必让他们成为用户?
我目前的想法是,我将有三个角色(管理员,成员和更新者)。 updater角色只能访问他们的个人资料,就是这样。我将使用cancan来限制它。
这是最好的方法吗? 我可以随机生成一个密码并通过电子邮件发送一个链接来编辑他们在电子邮件中的个人资料,当他们点击它时,我的程序可以询问他们的登录详细信息并离开他们去。我只是在想,如果不需要生成这么多用户,他们是否是更好的方法。
答案 0 :(得分:1)
使用随机生成的密码为您的个人资料模型添加一个列,然后有一个链接可以编辑该个人资料,将该密码编辑到要编辑的文件中的电子邮件地址。
class Profile < ActiveRecord::Base
def generate_edit_key!
self.edit_key = rand(9999999999)
save
end
end
class ProfilesController < ApplicationController
def request_edit_key
@profile = Profile.find(params[:id])
@proifle.generate_edit_key!
ProfileMailer.edit_profile_request(@profile).deliver
redirect_to @profile, :notice => 'Mail sent to profile owner'
end
def edit
if current_user
@profile = current_user.profile
else
@profile = Profile.find_by_id_and_edit_key(params[:id], params[:edit_key])
end
end
end
class ProfileMailer < ActionMailer::Base
def edit_profile_request(profile)
mail(:to => profile.email,
:subject => 'Edit your profile',
:body => "<%= link_to 'Click to edit' edit_profile_url(profile, :edit_key => profile.edit_key) %> If you didn't request this, please ignore.")
end
答案 1 :(得分:0)
如果您不想让他们成为用户,那么使用令牌系统授予他们临时访问权限。
link_to 'Let me update this profile', token_path(:id = @profile.id, :method => :post)
class TokensController < ApplicationController
def create
@profile = Profile.find(params[:id])
if @profile.send_token!
redirect_to profile_path(@profile), :notice => 'A token has been sent'
else
redirect_to profile_path(@profile), :error => 'A token could not be sent'
end
end
end
class Profile < ActiveRecord::Base
has_many :tokens
def send_token!
token = self.tokens.create()
TokenMailer.update_profile(token).deliver
end
end
class Token < ActiveRecord::Base
belongs_to :profile
before_save :generate_key, set_expiration
def generate_key
self.key = rand(999999999999)
end
def set_expiration
self.expires_at = 1.day.from_now
end
def expired?
expires_at > Time.now
end
end
class TokenMailer < ActionMailer::Base
def update_profile(token)
mail(:to => token.profile.email,
:subject => 'Edit your profile',
:body => "<%= link_to 'Click to edit' edit_profile_url(token.profile, :key => token.key) %>")
end
end
class ProfilesController < ApplicationController
def edit
if params[:key]
token = Token.find_by_key(params[:key])
if token.expired?
redirect_to root_url, :message => 'Token Expired'
else
@profile = token.profile
end
elsif current_user
@profile = current_user.profiles.detect{|p| p.id == params[:id] }
else
redirect_to root_url, :message => 'Not allowed'
end
end
end