Rails取消订阅与ActionMailer的链接

时间:2016-03-03 20:04:18

标签: ruby-on-rails email actionmailer

我有一个电子邮件模型,供用户在添加或更新文章时注册接收电子邮件通知。电子邮件工作正常,但我收到了一条错误消息,其中包含我在email.rb文件中生成的取消订阅方法。我在2012年发布的另一个stackoverflow问题中找到了取消订阅解决方案,但我没有看到如何正确使用解决方案。

电子邮件型号:

    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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您无法从模型中调用参数。但此外,您在生成视图时调用取消订阅功能,我认为这不是我们的意图。您的设置应该是:

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,但它实际上并未进行调用。您当前的代码正在拨打电话。