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