2016-03-03 107 views
1

我有一個電子郵件模型,供用戶在添加或更新文章時註冊以接收電子郵件通知。該電子郵件正常工作,但我收到一條錯誤消息,其中包含我在我的email.rb文件中生成的取消訂閱方法。我發現在2012年發佈的另一個stackoverflow問題中的取消訂閱解決方案,但我沒有看到如何正確工作解決方案。Rails取消訂閱與ActionMailer的鏈接

電子郵件型號:

class Email < ActiveRecord::Base 
     validates :email, uniqueness: true 
     validates :email, presence: true 

     def unsubscribe 
     Email.find(params[:id]).update_attributes(permissions: false) 
     end 
    end 

文章型號:

class Article < ActiveRecord::Base 
     ... 
     has_many :emails 

     after_create :send_new_notifications! 
     after_update :send_update_notifications! 

     def send_update_notifications! 
     email = Email.where(permissions: true) 
     email.each do |email| 
      UpdatedArticleMailer.updated_article(email, self).deliver_later 
     end 
     end 

     def send_new_notifications! 
     email = Email.where(permissions: true) 
     email.each do |email| 
      ArticleNotificationMailer.new_article(email, self).deliver_later 
     end 
     end 
    end 

在更新文章電子郵件退訂鏈接:

 <%= link_to "Unsubscribe", email_url(@email.unsubscribe) %> 

錯誤消息:

undefined local variable or method `params' for #<Email:0x007ff5c2955e88> 
    def unsubscribe 
    Email.find(params[:id]).update_attributes(permissions: false) 
    end 
end 

回答

1

不能調用從模型PARAMS。但是,您在生成視圖時調用了取消訂閱功能,我認爲這不是我們的意圖。您的設置應該是:

config/routes.rb

resources :emails do 
    get :unsubscribe, on: :member 
end 

這讓你一個正確的路線,從你的觀點命中。

app/controllers/email_controller.rb

def unsubscribe 
    email = Email.find params[:id] 
    email.update_attributes(permissions: false) 
    ... { handle errors, redirect on success, etc } ... 
end 

該處理控制的流程。

在視圖中,鏈路變爲:

unsubscribe_email_url(email) 

實質上,退訂方法移動到控制器。應該很簡單。請注意,此調用只是在用戶單擊鏈接時生成要調用的URL,並不實際進行調用。您目前的代碼正在撥打電話。

+0

關於:會員,這是我聲明的東西,例如電子郵件或這是從軌道上的東西? – jgrant

+0

我認爲這工作,但我看到一個模板錯誤。我假設這是因爲我沒有在我的退訂方法中設置句柄錯誤,重定向成功等? – jgrant

+1

對,您需要有一個名爲unsubscribe.erb的視圖,或者在成功時重定向它。 – GoGoCarl

1

params[:id]僅在控制器中可用。

你的link_to也沒有意義,它看起來像你試圖路由到你的模型,那些不能路由。它應該是控制器操作的鏈接,如EmailsController#Unsubscribe,並且該URL需要某種類型的ID。

class EmailsController < ApplicationController 
    def unsubscribe 
    if email = Email.find(params[:id]) 
     email.update_attribute(permissions: false) 
     render text: "You have been unsubscribed" 
    else 
     render text: "Invalid Link" 
    end 
    end 
end 

這並沒有考慮到你可能想使用一個令牌,而不是一個ID的帳戶,在這種情況下,請參閱本文使用MessageVerifier。

http://ngauthier.com/2013/01/rails-unsubscribe-with-active-support-message-verifier.html

+0

這個答案是不完整的,因爲視圖代碼阻止任何工作。但這似乎是要在控制器而不是模型中完成的事情...... – GoGoCarl

+0

我認爲你是對的。該模型根本不應該有取消訂閱方法。這不是真正的商業邏輯。 – SacWebDeveloper