2012-05-10 12 views
5

bir çağrı bir blok Ovma blok seçeneği aracılığıyla güzel initialize o:verir ben ActiveAttr ile çalışıyorum süper

person = Person.new() do |p| 
    p.first_name = 'test' 
    p.last_name = 'man' 
end 

Ancak ActiveAttr :: Modeli dahil belirli sınıfta, ben istiyorum bloğu başka bir şey için kullanmak istediğimden bu işlevi atla. İşte başlıyoruz:

def initialize(*) 
    super 
    yield self if block_given? 
end 

Yani benim çağrı gibiyse: blok hala zinciri iletilir ve sonunda ActiveAttr içini, bu kod çalıştırmak alır çünkü bu, sefil başarısız

class Imperator::Command 
include ActiveAttr::Model 
end 


class MyCommand < Imperator::Command 

    def initialize(*args, &block) 
    @my_block = block 

    super(*args) 
    end 
end 

böylece aşağıdaki

MyCommand.new() { |date| date.advance(month: 1) } 

başarısız olarak:

NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80> 

MyCommand'ın hiçbir yöntemi olmadığından, MyCommand'a yapılan çağrı açıkça başarısız oluyor.

Bu yüzden sorum şu: blok yeniden super'u aramadan önce yöntem imzasından kaldırmamın bir yolu var, böylece blok geçersiz kılınmış başlatıcımdan başka bir yere gitmiyor mu?

cevap

12

super(*args,&nil) 

bloğu olarak & yapar yakut kullanım nil deneyin ve yakut bu hiçbir bloğunu anlamı gerçekleştirmek için yeterince zeki görünüyor.

+0

Mükemmel, Neden bunu düşünmediğimi bilmiyorum. Teşekkürler! – TheDelChop

+1

Bu Ruby 2.0 hala mevcut olmasına rağmen, bu bir yakut böcek olmalı – Mikey

0

Bu kesinlikle net bir numaradır, ancak ActiveAttr :: Model modülünü doğrudan kullanmamanız ve bunun yerine yalnızca ihtiyacınız olan modülleri içermesi daha iyi bir yaklaşım olacaktır. Eğer gerçekten istemediğiniz başka şeyler de olabilir yapıyor ActiveAttr :: Modelinin parçalara ayrılmış görünümü gördükten sonra

yerine

class Imperator::Command 
    include ActiveAttr::Model 
end 

class Imperator::Command 
    include BasicModel 
    # include BlockInitialization 
    include Logger 
    include MassAssignmentSecurity 
    include AttributeDefaults 
    include QueryAttributes 
    include TypecastedAttributes 

    def initialize(*args, &block) 
    @my_block = block 
    super(*args) 
    end 
end 

yapın. Bu durumda sadece içeriklerini atlayın. Amaç, model oluşturmaya bir alakart yaklaşım sağlamaktı.

İlgili konular