2015-03-02 3 views
0

У меня есть класс сообщений, который вы можете отправить пользователю. До недавнего времени его можно было отправить только одному пользователю, но не требовать отправки нескольким пользователям. Я решил обернуть сообщение в MessageProxy (действительно Decorator, но это слово уже было принято 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. Это особенно странно, потому что с моими рельсами консоли, MessageProxy ведет себя, как и ожидалось:

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

Почему мой прокси-сервер не пересылает методу ассоциации к объекту сообщения?

Я посмотрел в исходный код SimpleForm и обнаружил, что этот вопрос
в 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) проверки, как так:

f.association :priority_type do |p| 
    p.input :something 
end 

Соответствующая часть SimpleForm :: FormBuilder:

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

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

, как вы можете видеть, пропусканием блок заставит его вернуться до достижения метода обижая.

Стоит попробовать хотя бы?

Смежные вопросы