Tag: 回调

有什么区别:before_save和:before_update Active Record回调?

有人可以向我解释:before_update在Ruby on Rails 4上的:before_save和:before_update Active Record回调之间的区别吗? 我阅读了有关Active Record回调的官方文档,但我找不到足够精细的解释。

Rails:在after_create中设置属性

我希望ActiveRecord使用回调自动设置一些DB字段。 class Product < ActiveRecord::Base after_create :set_locale def set_locale self.locale = I18n.locale end end 在./script/console我做 p = Product.create p 字段p.locale未设置。 我做错了什么?

Rails接受_ented_attributes_for回调

我有两个模型Ticket和TicketComment ,TicketComment是Ticket的孩子。 ticket.rb class Ticket :destroy, :order => ‘created_at DESC’ # allow the ticket comments to be created from within a ticket form accepts_nested_attributes_for :ticket_comments, :reject_if => proc { |attributes| attributes[‘comment’].blank? } end ticket_comment.rb class TicketComment < ActiveRecord::Base belongs_to :ticket validates_presence_of :comment end 我想要做的是模仿Trac中的function,如果用户对故障单进行更改和/或添加注释,则会向分配给故障单的人员发送电子邮件。 我想使用after_update或after_save回调,以便在发送电子邮件之前我知道所有信息都已保存。 如何检测模型的更改(ticket.changes)以及是否创建了新评论(ticket.comments)并在一封电子邮件中发送此更新(x更改为y,用户添加评论’text’)一个回调方法?

回形针回调或简单的处理器?

我想运行回调after_post_process但它似乎不适用于使用Paperclip 2.3.8的Rails 3.0.1。 它给出了一个错误: undefined method `_post_process_callbacks’ for # 我想在文件上传后调用Panda API。 我会为此创建我自己的处理器,但是当Panda处理处理时,它也可以上传文件,并将自己排队一段不确定的持续时间我认为回调会很好。 但回调似乎在Rails3中不起作用。 after_post_process :panda_create def panda_create video = Panda::Video.create(:source_url => mp3.url.gsub(/[?]\d*/,”), :profiles => “f4475446032025d7216226ad8987f8e9”, :path_format => “blah/1234”) end 我尝试在我的模型中使用并包含回形针,但似乎并不重要。 有任何想法吗?

如何在rails STI派生模型中禁用validation和回调?

给定一个模型 class BaseModel < ActiveRecord::Base validates_presence_of :parent_id before_save :frobnicate_widgets end 和派生模型(底层数据库表有一个type字段 – 这是简单的rails STI) class DerivedModel < BaseModel end DerivedModel将以良好的OO方式inheritanceBaseModel所有行为,包括validates_presence_of :parent_id 。 我想关闭DerivedModel的validation,并防止回调方法被触发,最好不要修改或以其他方式破坏BaseModel 什么是最简单,最强大的方法?

适用于所有型号的ActiveRecord全局回调

我的RoR应用程序中有大约40个模型。 我想为所有模型设置一个after_save回调。 一种方法是将其添加到所有模型中。 由于此回调具有相同的代码,因此有一种方法可以全局定义它,以便为所有模型调用它。 我试了这个没有运气: class ActiveRecord::Base after_save :do_something def do_something # …. end end 如果我在单个模型中执行相同的代码。 谢谢,伊姆兰

如何在所有控制器和操作之外运行before_action?

我有一个rails 4.2.x app,设计用于身份validation – 我有几个控制器。 我想要设计authenticate_user! 除了在主控制器索引操作之外的所有控制器和操作上运行的方法。 (当然,authenticate_user!本身需要注意设计登录等操作) 我可以确保每个控制器操作都在application_controller.rb中运行before_action: class ApplicationController < ActionController::Base before_action :authenticate_user! … end 我还可以限制所有控制器上的一组特定操作: class ApplicationController < ActionController::Base before_action :authenticate_user!, except: [:index] … end 但我不知道如何让home / index成为例外。 当然,我可以手动添加before_action :authenticate_user! 到每个控制器,并为主控制器添加一个exception以进行索引操作。 但这不是很干,如果我添加新的控制器,我需要记住将这个before_action添加到每个控制器。

在Rails中手动设置updated_at

我正在将我的旧博客post迁移到我的新Rails博客中,我希望他们的updated_at属性与我旧博客上的相应值相匹配(而不是他们迁移到我的新Rails博客的日期)。 我怎样才能做到这一点? 当我手动设置updated_at ,它会被before_save回调覆盖。 注意:此问题仅对Rails <3.2.11有效。 较新版本的Rails允许您手动设置时间戳,而不会覆盖它们。

Rails:如何限制has_many关联中的项目数(来自Parent)

我想限制关联中的项目数。 我想确保用户没有超过X物品。 这个问题之前被问过 ,解决方案在孩子身上有逻辑: 提供的解决方案(针对类似问题): class User :destroy end class Thing :create def thing_count_within_limit if self.user.things(:reload).count >= 5 errors.add(:base, “Exceeded thing limit”) end end end 硬编码的“5”是一个问题。 我的限制根据父级更改。 物品集合知道它相对于用户的限制。 在我们的例子中,管理员可以调整每个用户的限制(事物),因此用户必须限制其收集的东西。 我们可以让thing_count_within_limit请求其用户的限制: if self.user.things(:reload).count >= self.user.thing_limit 但是,这是Thing的很多用户反省。 对用户的多次调用,特别是(:reload)对我来说是红色标志。 想要更合适的解决方案: 我认为has_many :things, :before_add => :limit_things会起作用,但我们必须提出一个例外来阻止链 。 这迫使我更新things_controller以处理exception,而不是if valid?的rails约定if valid? 或者if save 。 class User has_many :things, :before_add => […]

Rails postgresql如何将事务隔离级别设置为可序列化

我有一个评论模型,属于一个主题模型。 在Comment模型中,我有一个before_create回调 def on_create Topic.transaction(:require_new => true) do Topic.connection.execute(‘SET TRANSACTION ISOLATION LEVEL SERIALIZABLE’) self.topic.increment!(:comment_counter) if conditions end end 问题是我得到一个ActiveRecord::StatementInvalid: PGError: ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query 。 有没有其他方法来设置事务隔离级别?