0

我已经定义了一个回调 after_find,用于根据检索到的模型实例检查一些设置。如果未完成设置,我不希望从 find 方法返回实例。那可能吗?

控制器的示例如下:

class UtilsController < ApplicationController
  def show
    @util = Util.find(params[:id])
  end 
end

该模型:

class Util < ActiveRecord::Base
  after_find :valid_util_setting

  def valid_util_setting
    # calculate_availability? complex calculation 
    # that can not be part of the sql statement or a scope 

    unless self.setting.calculate_availability?(User.current.session)
      #if not available => clear the record for view
    else
      #nothing to do here
    end 
  end 
end
4

3 回答 3

1

与其尝试清除记录,不如提出异常?

例如

unless self.setting.calculate_availability?(User.current.session)
  raise ActiveRecord::RecordNotFound
else
...
于 2013-08-14T11:32:08.397 回答
0

恐怕您无法在此回调中清除找到的记录也许您应该从一开始就找到所有选项的范围?IE@util = Util.scoped.find(params[:id])

于 2013-08-14T11:34:15.123 回答
0

我找到了解决方案

def valid_util_setting
  Object.const_get(self.class.name).new().attributes.symbolize_keys!.each do |k,v| 
    begin
      self.assign_attributes({k => v})#, :without_protection => true)
    rescue ActiveModel::MassAssignmentSecurity::Error => e; end
  end
end

有了这个,我可以创建一个几乎空的对象

于 2013-08-15T07:15:50.380 回答