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_path并且new_notification_path在模型中不可用。

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

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

4

2 回答 2

2

将其提取到一个模块并“混合”以在您需要的两个地方访问它。

您可以将模块放在您喜欢的任何位置:lib 文件夹在历史上一直很受欢迎,或者在您的应用程序目录中创建一个“模块”文件夹。

于 2013-05-01T06:51:19.240 回答
1

放入/app/helpers/lib

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

于 2013-05-01T07:20:50.960 回答