【问题标题】:Rails4: Using Rails Concerns in calling callbacksRails4:在调用回调时使用 Rails 关注点
【发布时间】:2014-02-21 03:59:41
【问题描述】:

使用 rails4,我正在尝试实现通知模型。在这里,我使用 ActiveSupport::Concern 将我的通知相关代码与模型分开。 create_notification_module.rb

module CreateNotificationModule
   extend ActiveSupport::Concern
   include ActiveModel::Dirty

   included do
     after_update :notify 
     after_create :notify
     after_create :notify
   end
   def notify
     record = Notification.new( 
                  :ref_table => self.class,                           
                  :ref_id => self.id,                          
                  :receiver => ? ,  # owner of the parent model if parent exists
                  :sender => current_user.id,     
                  :details => self.changes,                   
                  :is_read => 0)
     record.save!

   end

这里我需要知道这个回调是从哪个控制器/模型调用的,这样我就可以编写我的 switch case。例如, 案例评论:获取用户cmet的消息的所有者 案例如:获取喜欢的 msg/cmt 的所有者等,不胜感激。

【问题讨论】:

    标签: ruby-on-rails-4 callback activesupport-concern


    【解决方案1】:

    我不确切知道您的需求是什么,但我建议您重新考虑他的工作方式,因为您似乎误用了关注点的概念,并且会让自己陷入代码混乱.如果您正在编写一个 switch 语句并检查类型以实现每个类的自定义行为,我认为一个问题是使用错误的工具。几个类之间共享的关注点为所有这些类添加了相同的行为。似乎您想共享一些代码来干燥事物,但又想根据哪个类发送消息来自定义某些方面。也许构建 Notification 或 NotificationBuilder 类的辅助方法在这里会更好。然后每个类都可以得到一个 Notification 并根据他们的需要设置它的属性。这样未来的程序员就不会在 Comment 和 User 的行为不同时感到惊讶,即使它们都包含 CreateNotificationModule(这意味着行为是相同的)。

    我强烈推荐这本书Practical Object Oriented Design in Ruby: An Agile Primer;它比我更雄辩地和令人信服地解释了为什么你要编写的 switch 语句是一个坏主意。

    我意识到这实际上不是一个答案,但它不适合 cmets。很抱歉。

    【讨论】:

    • 更广泛地说,为什么回调和/或验证不起作用?
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多