我有以下用例:我有一個API和一個UI,它們都修改相同類型的對象Vehicle。但是,如果車輛從用戶界面進行了修改,則必須提供車輛識別號碼,如果修改了車輛識別號碼,則該號碼可能還不知道,因爲尚未在發動機組上標記該號碼(這顯然是製造的例)。清掃器從不觸發
所以我的模式是:
class Vehicle < ActiveRecord::Base
after_initialize :set_ivars
def set_ivars
@strict_vid_validation = true
end
validate :vid, length: {maximum: 100, minimum: 30}, presence: true, if: lambda { |o| o.instance_variable_get(:@strict_vid_validation) }
validate :custom_vid_validator, unless: lambda { |o| o.instance_variable_get(:@strict_vid_validation) }
end
兩個上級控制器:
class ApplicationController < ActionController::Base
before_filter :set_api_filter
private
def set_api_filter
@api = false
end
end
和ApiController
,設置@api
爲true
及以下車輛控制器:
class VehicleController < ApplicationController
cache_sweeper VehicleSweeper, only: [:create, :update]
def create
@vehicle = Vehicle.new
@vehicle.update_attributes(params[:vehicle])
end
end
與下列機:
class VehicleSweeper < ActionController::Caching::Sweeper
observe Vehicle
def before_validation(vehicle)
if self.instance_variable_get(:@api)
vehicle.instance_variable_set(:@strict_vid_validation, false)
else
vehicle.instance_variable_set(:@strict_vid_validation, true)
end
end
和稍微similiar ApiVehicleController
但是,這是行不通的。經過調試我發現:
1)在清掃的before_validation
(也沒有配置其他任何回調)方法從不運行
2)更嚴格的UI驗證始終觸發,這是由於
3)在lambda裏面if:驗證時,instance_variable始終爲真,因爲它從來沒有通過回調方法設置
爲什麼這不起作用?我該如何解決它?如果不是,我可以採取不同的方法嗎?