2013-07-26 69 views
0

我有一個客戶端的ID,名稱和電子郵件字段,我發送郵件使用ActionMailer與第三方SMTP。如何爲Actionmailer的電子郵件生成取消訂閱鏈接?

現在我希望客戶也有訂閱選項,所以我添加了「訂閱」列,默認值爲true。

現在如何產生的,可以在視圖中把郵件模板,所以當它在用戶點擊,訂閱值更改爲false,以便在未來的客戶端不」得到任何電子郵件中的鏈接?請注意,這些客戶是不是我的Rails應用程序的用戶,所以我不能用什麼在這裏建議Rails 3.2 ActionMailer handle unsubscribe link in emails

我發現這個鏈接how to generate link for unsubscribing from email過這看上去有益的,但我想可能是在3年內,我們也許就能得到更好的解決方案

這是我的完整代碼 -

#client.rb 

attr_accessible :name, :company, :email 

belongs_to :user 
has_many :email_ids 
has_many :emails, :through => :email_ids 

before_create :add_unsubscribe_hash 

private 

def add_unsubscribe_hash 
    self.unsubscribe_hash = SecureRandom.hex 
end 

這裏是Clients_controller.rb文件

# clients_controller.rb 

    def new 
    @client = Client.new 

    respond_to do |format| 
     format.html 
     format.json { render json: @client } 
     format.js 
    end 
    end 

    def create 
    @client = current_user.clients.new(params[:client]) 
    respond_to do |format| 
     if @client.save 
     @clients = current_user.clientss.all 
     format.html { redirect_to @client } 
     format.json { render json: @client } 
     format.js 
     else 
     @clients = current_user.clients.all 
     format.html { render action: "new" } 
     format.json { render json: @client.errors, status: :error } 
     format.js 
     end 
    end 
    end 

def unsubscribe 
    @client = Client.find_by_unsubscribe_hash(params[:unsubscribe_hash]) 
    @client.update_attribute(:subscription, false) 
end 

代碼工作正常現有記錄和退訂工作完美,我只是在創造新的客戶端有問題。 _form -

我已經退訂方法,我使用這個對象client_mailer.rb模板(!使用@client或只使用客戶端,兩者都工作)

EDIT 2使用@client。 html.erb

<%= simple_form_for(@client, :html => {class: 'form-horizontal'}) do |f| %> 

    <%= f.input :name, :label => "Full Name" %> 
    <%= f.input :company %> 
    <%= f.input :email %> 
    <%= f.button :submit, class: 'btn btn-success' %> 
<% end %> 

我在http://jsfiddle.net/icyborg7/dadGS/

回答

5

複製完整的堆棧跟蹤嘗試每個客戶端提供唯一的,但模糊的,關聯的標識符可用於通過電子郵件中包含的取消訂閱鏈接查找(和取消訂閱)用戶。

開始通過添加另一列到你的客戶的表稱爲unsubscribe_hash

# from command line 
rails g migration AddUnsubscribeHashToClients unsubscribe_hash:string 

然後,隨機哈希與每個客戶關聯:

# app/models/client.rb 
before_create :add_unsubscribe_hash 

private 

def add_unsubscribe_hash 
    self.unsubscribe_hash = SecureRandom.hex 
end 

創建一個控制器動作,將切換subscription布爾到true

# app/controllers/clients_controller.rb 
def unsubscribe 
    client = Client.find_by_unsubscribe_hash(params[:unsubscribe_hash]) 
    client.update_attribute(:subscription, false) 
end 

把它掛到一個路線:

# config/routes.rb 
match 'clients/unsubscribe/:unsubscribe_hash' => 'clients#unsubscribe', :as => 'unsubscribe' 

然後,當客戶對象傳遞給的ActionMailer,你將有機會獲得unsubscribe_hash屬性,您可以通過以下列方式聯繫:

# ActionMailer view 
<%= link_to 'Unsubscribe Me!', unsubscribe_url(@user.unsubscribe_hash) %> 

單擊鏈接時,將觸發unsubscribe操作。客戶端將通過傳入的unsubscribe_hash查找,subscription屬性將轉爲false

UPDATE:

要爲unsubscribe_hash屬性爲現有客戶增加價值:

# from Rails console 
Client.all.each { |client| client.update_attribute(:unsubscribe_hash, SecureRandom.hex) } 
+0

感謝@Zeantsoi,我要通過代碼並執行它,看起來非常好。我會在24小時內回來接受答案 – iCyborg

+0

很高興幫助! – zeantsoi

+0

嗨@zeantsoi - 它看起來工作,但我得到模板丟失錯誤「缺少模板客戶端/取消訂閱」,所以我需要創建一個視圖或我可以做一些重定向?怎麼做。 – iCyborg

相關問題