2015-11-21 56 views
1

如何重寫ruby父類中的一行或多行代碼? 例如:我有方法create Rails的控制器類:Ruby特別重寫父類方法

class GenericController < ApplicationController 
def create 
    @resource = SomeClass.new 
    if @resource.save 
     ... 
    else 
     ... 
    end 
    end 
end 

而且我還有一個控制器,孩子該控制器的

class ChildController < GenericController 
    def create 
    super do 
     # HERE I WANT TO DO SOME ACTIONS BEFORE SAVE. 
    end 
    end 
end 

我怎樣才能做到這一點?我試過這個(通用控制器):

def create 
    @resource = SomeClass.new 
    yield if block_given? 
    if @resource.save 
     ... 
    end 
    end 

但是如果我想通過多個塊呢?例如,如果我想做回調:after_init,:before_save,:after_save等?

回答

1
def create 
    super do 
     # HERE I WANT TO DO SOME ACTIONS BEFORE SAVE. 
    end 
    end 

但是,如果我想傳遞一個街區更是什麼?例如,如果我想 進行回調:after_init,:before_save,:after_save的等

您需要的塊傳遞給超類方法create()方法:

class Dog < GenericController 
    before_save do 
    puts 'before1' 
    end 

    after_save do 
    puts 'after1' 
    end 

    before_save do 
    puts 'before2' 
    end 

    def create 
    super 
    end 

end 

class GenericController 
    class <<self 
    attr_accessor :before, :after 

    def before_save(&block) 
     @before << block 
    end 

    def after_save(&block) 
     @after << block 
    end 
    end 

    def self.inherited(subclass) 
    subclass.instance_variable_set(:@before, []) 
    subclass.instance_variable_set(:@after, []) 
    end 

    def create 

    self.class.before.each do |proc| 
     proc.call 
    end 

    puts 'saving resource...' 
    #@resource.save 

    self.class.after.each do |proc| 
     proc.call 
    end 

    end 

end 

Dog.new.create 

--output:-- 
before1 
before2 
saving resource... 
after1 
+0

好的,但是如果我想添加一些代碼如果資源創建後呢?塊將執行兩次。 – Roman

+0

謝謝=)這就是我想要的=) – Roman

+0

@Roman,如果你用你的創建方法傳遞塊:1)你將不得不多次調用create()。 2)您必須添加一個變量,指示該塊在*塊之後是*之前的*還是*。 3)超級類將不得不跳過'resource.save'步驟'if block_given?' – 7stud