2011-12-12 69 views
4

我試圖創建一個郵件程序,只要用戶註冊就發送一封電子郵件。很簡單,但我是新來的鐵軌。Rails用戶註冊郵件確認

我有一個網站已經創建用戶。我有一個登錄和註冊頁面可以正常工作,但需要一些幫助創建郵件程序,發送電子郵件確認鏈接,並可能發送這些電子郵件,而無需用戶註冊,就像爲用戶邀請創建單獨的頁面一樣。

我已經生成的模型invitation.rb

class Invitation < ActiveRecord::Base 
    belongs_to :sender, :class_name => 'User' 
    has_one :recipient, :class_name => 'User' 

    validates_presence_of :recipient_email 
    validate :recipient_is_not_registered 
    validate :sender_has_invitations, :if => :sender 

    before_create :generate_token 
    before_create :decrement_sender_count, :if => :sender 

    private 

    def recipient_is_not_registered 
    errors.add :recipient_email, 'is already registered' if User.find_by_email(recipient_email) 
    end 

    def sender_has_invitations 
    unless sender.invitation_limit > 0 
     errors.add_to_base 'You have reached your limit of invitations to send.' 
    end 
    end 

    def generate_token 
    self.token = Digest::SHA1.hexdigest([Time.now, rand].join) 
    end 

    def decrement_sender_count 
    sender.decrement! :invitation_limit 
    end 
    #attr_accessible :sender_id, :recipient_email, :token, :sent_at 
end 

和我invitiation_controller.rb

class InvitationsController < ApplicationController 
    def new 
    @invitation = Invitation.new 
    end 

    def create 
    @invitation = Invitation.new(params[:invitation]) 
    @invitation.sender = current_user 
    if @invitation.save 
     if logged_in? 
     Mailer.deliver_invitation(@invitation, signup_url(@invitation.token)) 
     flash[:notice] = "Thank you, invitation sent." 
     redirect_to projects_url 
     else 
     flash[:notice] = "Thank you, we will notify when we are ready." 
     redirect_to root_url 
     end 
    else 
     render :action => 'new' 
    end 
    end 
end 

還有什麼我需要修改?我該如何把這個掛鉤到已經存在的用戶註冊和登錄工作正常?

回答

1

你應該已經有了一個UsersController或類似的以登記爲目的的東西,您目前通過名爲route的signup_url訪問。假設這條路線現在是這樣的:

http://localhost:3000/register/code_here 

所有你現在要做的是檢查在控制器動作邀請並處理相應的,像這樣:

def new 
    invite = Invite.find_by_token(params[:id] 

    if invite.nil? 
    redirect_to root_path, :notice => "Sorry, you need an invite to register" 
    end 

    @user = User.new(:email => invite.recipient_email) 

end 

def create 
    invite = Invite.find_by_token(params[:token] 

    if invite.nil? 
    redirect_to root_path, :notice => "Sorry, you need an invite to register" 
    end 

    begin 

    invite.nil.transaction do 
     invite.nil.destroy! 
     @user = User.create(params[:user) 
    end 

    redirect_to my_dashboard_path, :notice => "Yay!" 

    rescue ActiveRecord::RecordInvalid => invalid 
    render :new, :alert => "Validation errors" 
    end 

end 

沒有邀請碼,你會簡單地重定向到根頁面。儘管如此,你可能想幹這個檢查。當有人使用邀請碼時,您可能希望將其從數據庫中刪除。我把它包裝在一個交易中,但這取決於你(創建用戶可能更重要)。

如果你想創建一個頁面,讓用戶無需註冊創建的邀請,後來乾脆不加驗證,InvitationsController和更新這個片段:

def create 

    @invitation = Invitation.new(params[:invitation]) 
    @invitation.sender = current_user if logged_in? 

    if @invitation.save 

    Mailer.deliver_invitation(@invitation, signup_url(@invitation.token)) 
    flash[:notice] = "Thank you, invitation sent." 

    if logged_in? 
     redirect_to projects_url 
    else 
     redirect_to root_url 
    end 

    else 
    render :action => 'new' 
    end 

end 

我不知道我是否覆蓋所有的基礎,但我認爲這應該指出你至少在正確的方向。

+0

是的!謝謝你,這正是我想要做的。以及只是想收到一封電子郵件,併發送了一些說明您已註冊的信息。也許我會用邀請的東西去做這個錯誤的方式。我真的不想發出邀請讓他們註冊,只要他們註冊,他們就會收到確認郵件。邀請可以遲到。所以如果我希望它只發送一封確認電子郵件,我可以使用我已經制作的相同代碼(來自railscast)發送確認電子郵件嗎?我將在哪裏以及需要將哪些內容放入我的user_controller? –

+0

是的,儘管您可以創建兩個令牌(一個用於邀請,另一個用於註冊)。這個過程是一樣的,除了也許你可以添加另一個動作來處理確認電子郵件鏈接。 – Jaryl

1

我看不到Mailer.deliver_invitation來自哪裏,你使用寶石嗎?如果你想創建mailer.rb,它會有幫助嗎,你有任何錯誤毫克/堆棧跟蹤?

看一看這裏有一些導遊,5行動梅勒配置 http://guides.rubyonrails.org/action_mailer_basics.html

考慮使用設計進行用戶驗證,https://github.com/plataformatec/devise 它是複雜的,但有據可查的,易於配置,以便迅速啓動。

我假設你正在使用Rails 3.1(工作也在早期版本中,只要找到正確的指導,你的Rails版本,可以肯定的)

+0

devise安裝在本網站上,但我並不熟悉它,並且很難配置它,這就是爲什麼我試圖自己創建這個郵件程序。任何關於如何在有人註冊時輕鬆設置簡單的自動電子郵件確認的輸入設計將是一個很大的幫助。謝謝大家的快速回復! –

+0

首先啓動的是他們的[github](https://github.com/plataformatec/devise),然後是** Wiki **。下面是使用rspec和cucumber的另一個例子,但暫時略過,所以你只需使用[定製設計]的教程(https://github.com/RailsApps/rails3-devise-rspec-cucumber/wiki/Tutorial) - rspec /黃瓜可能對你有好處。 – vik

相關問題