1

我有一个带有 id、name 和 email 字段的表 CLIENTS,我正在使用带有 3rd 方 SMTP 的 ActionMailer 向他们发送电子邮件。

现在我希望客户也有订阅选项,所以我添加了默认值为 true 的“订阅”列。

现在如何生成一个可以放在视图邮件模板中的链接,这样当用户点击它时,订阅值会变为 false,所以将来客户不会收到任何电子邮件?请注意,这些客户不是我的 Rails 应用程序用户,所以我不能使用此处建议的内容Rails 3.2 ActionMailer 处理电子邮件中的取消订阅链接

我发现这个链接如何生成从电子邮件退订的链接,这看起来很有帮助,但我认为可能在 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

该代码对现有记录运行良好,并且取消订阅运行良好,我只是在创建新客户时遇到问题。

我在取消订阅方法中使用了@client,因为我在client_mailer.rb 模板中使用了这个对象(使用@client 或仅使用客户端,两者都在工作!)

编辑 2 - _form.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/复制了完整的跟踪堆栈

4

1 回答 1

6

尝试将每个客户端与一个唯一但晦涩的标识符相关联,该标识符可用于通过电子邮件中包含的取消订阅链接查找(和取消订阅)用户。

首先在您的客户表中添加另一列,名为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.

更新:

unsubscribe_hash要为现有客户端的属性添加值:

# from Rails console
Client.all.each { |client| client.update_attribute(:unsubscribe_hash, SecureRandom.hex) }
于 2013-07-26T16:06:58.743 回答