2015-03-02 59 views
0

我有一個消息類可以發送給用戶。直到最近,它只能發送給一個用戶,但不是要發送給多個用戶。我決定在MessageProxy中包裝消息(真的是一個裝飾器,但這個詞已經被Draper採用了)。爲裝飾器創建SimpleForm

class Message < ActiveRecord::Base 
    belongs_to :priority_type 
end 

class MessageProxy 
    def initialize(args = {}) 
    @message = Message.new(args) 
    end 
    def method_missing(method_sym, *arguments, &block) 
    @message.send(method_sym, *arguments, &block) 
    end 
end 

我試圖使用消息代理的形式,但我得到Association :priority_type not found。這是特別奇怪,因爲從我的rails控制檯,MessageProxy行爲與預期相同:

MessageProxy.new.priority_type # => nil instead of an exception 

爲什麼我的代理轉發的關聯方法的消息對象?

我查看了SimpleForm源代碼,發現問題是
in SimpleForm::FormBuilder.find_association_reflection(association)。它看起來在@object.class,但由於@object是我的裝飾者,而不是代表,它無法找到關聯。

如果我覆蓋.class使它像消息一樣嘎嘎聲,那麼當我嘗試呼叫MessageProxy.new.valid?時,我也會啓動消息驗證程序。

回答

0

code並沒有看到您的視圖代碼,我可以建議的唯一的事情是,而不是僅僅使用f.association :priority_type,讓SimpleForm推斷出剩下的,你應該通過一個塊,以避免SimpleForm::FormBuilder.find_association_reflection(association)檢查,像這樣:

SimpleForm :: FormBuilder的
f.association :priority_type do |p| 
    p.input :something 
end 

相關部分:

def association(association, options = {}, &block) 
    options = options.dup 

    return simple_fields_for(*[association, 
    options.delete(:collection), options].compact, &block) if block_given? 
    ... 
end 

,你可以看到經過塊將導致它在到達犯罪方法之前返回。

值得一試至少?