我有一个电子邮件模型,供用户在添加或更新文章时注册接收电子邮件通知。电子邮件工作正常,但我收到了一条错误消息,其中包含我在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
答案 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,但它实际上并未进行调用。您当前的代码正在拨打电话。