2011-12-07 92 views
0

我有一個網站,我創建了Rails 3.0與設計& cancan安裝。此應用程序擁有超過4000人的成員可以查看的列表。數據庫中很少有人是成員。rails允許非用戶編輯自己的配置文件

有沒有辦法允許4000人訪問更新他們的個人資料,而不必讓他們成爲用戶?

我目前的想法是,我將有三個角色(管理員,成員和更新者)。更新者角色只能訪問他們的個人資料,就是這樣。我會用cancan限制這個。

這是做到這一點的最好方法是什麼? 我可以隨機生成一個密碼,並通過電子郵件發出鏈接,在電子郵件中編輯他們的個人資料,當他們點擊它時,我的程序可能會要求他們的登錄詳細信息,然後離開他們。我只是想,如果他們是這樣做的更好的方式,而不需要產生這麼多的用戶。

回答

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 
+0

我不得不關閉設計認證檢查編輯和更新,有沒有辦法解決這個問題,而不需要重寫authenticate_user!?這裏是我目前使用的行: before_filter:authenticate_user !,:except => [:edit,:update] – map7

+0

@ map7你可以創建一個特殊的控制器和動作來執行編輯,而不是保護那個。 – Unixmonkey

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