2014-02-14 56 views
0

我有以下用例:我有一個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始終爲真,因爲它從來沒有通過回調方法設置

爲什麼這不起作用?我該如何解決它?如果不是,我可以採取不同的方法嗎?

回答

0

最後,以下工作:

def my_controller_action 
    @vehicle = Vehicle.new 
    @vehicle.assign_attributes(params[:vehicle]) 
    VehicleSweeper.send(:new).pick_a_validation(@vehicle) 
    @vehicle.save 
end 

並且在清掃除去線

observe Vehicle 

和重命名before_validation方法pick_a_validation

當然,這只是因爲我想做一個before_validation。如果我想要說after_validation,我不知道我會如何入侵它。

在任何一種情況下,我都希望聽到如何完成這項工作,而不像我一樣完全繞過回調鏈。