【问题标题】:rails arguments to after_save observer将参数传递给 after_save 观察者
【发布时间】:2010-04-01 17:50:06
【问题描述】:

我希望用户在表单上输入以逗号分隔的登录列表,以便在创建新评论/帖子时通过电子邮件通知。我不想将此列表存储在数据库中,因此我将使用 form_tag_helper 'text_area_tag' 而不是表单助手 text_field。我有一个“after_save”观察者,它应该在创建评论/帖子时发送一封电子邮件。据我所知,after_save 事件仅将模型对象作为参数,那么如何将这个非模型支持的登录列表传递给观察者,以传递给在 cc 列表中使用它们的 Mailer 方法。

谢谢

【问题讨论】:

    标签: ruby-on-rails activerecord observer-pattern


    【解决方案1】:

    您想将列表存储在virtual attribute 中。它将在after_save 回调中可用。

    【讨论】:

      【解决方案2】:

      我认为更好的方法是使用无表模型。以Railscatsts screencast 为例。这很简单。

      【讨论】:

      • 我确实想将其他表单字段存储在表中。只是不是这个带有登录列表的特定字段。我必须为此创建一个单独的模型吗?
      • 为什么不呢?您的情况与此截屏视频中的情况相同。这是对新评论或帖子的建议。如果评论和帖子在您的应用程序中是不同的模型,您甚至可以与此模型建立多态关联(它们是值得推荐的)。详情请查看此类截屏视频。
      • 您好,我想将表单上的所有字段都存储在数据库中,但其中一个字段除外。在这里只为一个字段创建一个单独的模型似乎有点过头了,尽管这可能有效。我认为使用 getter 和 setter 方法为当前模型对象创建一个新的实例变量是一个更好的解决方案。谢谢
      • 虚拟属性,正如乔纳森朱利安所建议的那样,比无表模型更简单。但是如果可以推荐数字模型,我认为应该考虑无表模型坚持“不要重复自己”的原则。
      【解决方案3】:

      这是您需要的模型(连同表单)和用户模型中的虚拟属性。

      # app/models/user.rb
      class User < ActiveRecord::Base
       # virutal attribute and validations
       attr_accessor :unpersisted_info
       validates_presence_of :unpersisted_info
      end
      
      # app/models/user_observer.rb
      class UserObserver < ActiveRecord::Observer
        def after_save(user)
          # logic here... 
        end
      end
      
      # form for view... 
      <%form_for @user do |f|%>
        <%= f.text_field :unpersisted_info %>
        <%= f.submit "Go" %>
      <%end%>
      

      【讨论】:

      • 在 after_save 方法中,您可以访问“unpersisted_info”属性 def after_save(user) self.unpersisted_info.split(",").each {|item| p 项目} 结束
      猜你喜欢
      • 2019-01-24
      • 1970-01-01
      • 2017-01-23
      • 2023-03-26
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多