在哪里放置控制器和邮件程序使用的实用程序代码?

时间:2013-05-01 00:16:05

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我们的应用有“通知”,您可以通过网站上的收件箱查看,也可以通过电子邮件告诉您相关信息。当您收到通知时,它会包含一个回复相关邮件的链接。这可能意味着将PM发送回原始邮件的发件人,或者可能意味着对帖子发表评论。

这是用于确定要使用的回复链接的代码:

if @notification.post
  # comment on the post in question
  @reply_link = new_comment_path(:post_id => @notification.post.id)
else
  # by default, reply link sends a PM in return
  @reply_link = new_notification_path(
    :recipient_id => @notification.sender.id,
    :subject => @notification.subject =~ /^Re: / ?
      @notification.subject :
      "Re: " + @notification.subject
  ) 
end

我从控制器代码中获取了它,顺便说一下:app/controllers/notifications_controller.rb

现在我们要在电子邮件通知中包含相同的回复链接,这意味着我们需要在app/mailers/notifier.rb

中生成相同类型的回复链接

我不想重复自己,所以我宁愿创建一个reply_link方法,并把它放在控制器和邮件程序都可以访问它的地方。

我的第一个想法是把它放在模型中,这样我们就可以Notification.reply_link。这很好,但它不起作用,因为我们需要模型中没有的new_comment_pathnew_notification_path

我的第二个想法是使用帮手,但是a)每个人似乎都认为帮助者很糟糕,而b)我们无论如何也无法让它工作。

那么,我应该在哪里放置这个方便的reply_link方法,以便控制器和邮件程序都可以访问它,并且与良好的编码实践保持一致?

2 个答案:

答案 0 :(得分:2)

将其解压缩到模块并“混入”以在您需要的两个位置访问它。

您可以将模块放在任何您喜欢的地方:lib文件夹一直是历史上最受欢迎的地方,或者在您的app目录中创建“modules”文件夹。

答案 1 :(得分:1)

将其放入/app/helpers/lib

我通常倾向于将控制器访问的方法放在助手