问题
我想为我的用户实施电子邮件首选项。我认为无论是rails-settings gem 还是它的rails-settings-cached fork 都是可行的方法,但我不太确定。我应该使用 rails-settings(或 rails-settings-cached)gem 来执行此操作,还是有更好的方法?如果我应该使用这些宝石之一,任何提示或潜在的陷阱都将不胜感激。
我想做的事
主开关 - 打开或关闭所有系统电子邮件
每个用户都有一个“主开关”,告诉我他们是否选择退出所有电子邮件。它基本上是一个显示“向我发送电子邮件”的复选框。如果未选中该框(假),他们将永远不会收到系统电子邮件(密码重置除外)。如果选中该框(真),他们就有资格获得系统电子邮件。
选择加入/退出多个系统电子邮件
如果主开关是“真”(符合电子邮件条件),接下来的配置是我为各个系统电子邮件提供复选框(“收到新消息”、“我开始的线程上的新评论”)。他们可以选择加入或退出每个系统电子邮件。
选择加入/退出一些带有额外递送选项的电子邮件
最后,一些电子邮件将是“摘要”电子邮件,我想知道用户是否有资格接收电子邮件以及他们希望多久收到一次。例如,帐户活动的每日摘要。我想让他们选择加入/退出电子邮件,并告诉我如果他们选择加入,可以在哪个工作日发送摘要。所以“是的,周一到周五给我发这封电子邮件。” 或每周摘要电子邮件:“是的,每周日给我发送这封电子邮件。”
如果我了解 rails-settings gem,那么我的用户模型将如下所示:
class User < ActiveRecord::Base
has_settings do |s|
s.key :email_master, :default => true
s.key :new_comment_email, :default => true
s.key :daily_recap_email, :defaults => { :send => true, :days => [0,1,2,3,4,5,6] }
# or maybe this would be easier
s.key :daily_recap_email, :defaults => { :send => true, :sunday => true, :monday => true, :tuesday => true }
s.key :weekly_recap_email, :defaults => { :send => true, :day => 0 }
end
end
然后,我可以这样说:
if user.settings.email_master && user.settings.new_comment_email
UserMailer.new_comment_email(user).deliver
end
或者,daily_recap 电子邮件的一个更复杂的案例:
if user.settings.email_master && user.settings(:daily_recap_email).send && user.settings(:daily_recap_email).days.include?(3)
UserMailer.daily_recap_email(user).deliver
end
我在以前的应用程序中为此做了什么
以前,我使用与我的用户模型一对一的 EmailPreferences 模型来完成此操作。问题是扩展它很困难 - 每当我基于某个事件创建新的系统电子邮件时,我都必须在我的 EmailPreferences 表中添加一列。这也很棘手,因为该表主要是布尔值,所以我可以设置“输入”或“输出”(真或假),但仅此而已。我还发现很难确定用户是否应该收到电子邮件,因为我必须链接方法才能解决最终问题,“我应该将这封电子邮件发送给这个用户吗?”