我有一个可以发送给用户的消息类。直到最近,它才能发送给单个用户,但不是要求发送给多个用户。我决定将消息包装在MessageProxy中(真的是一个装饰器,但这个词已经被Draper占用了。)
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源代码,发现问题是
在SimpleForm::FormBuilder.find_association_reflection(association)
。它会查看@object.class
,但由于@object是我的装饰者,而不是委托人,因此无法找到关联。
如果我覆盖.class
以使其像消息那样嘎嘎叫,那么当我尝试调用MessageProxy.new.valid?
时,我也会触发消息验证器。
答案 0 :(得分:0)
从code并且没有看到您的视图代码,我唯一可以建议的是,不要只使用f.association :priority_type
并让SimpleForm推断其余部分,您应该传递一个块以避免{ {1}}检查如下:
SimpleForm::FormBuilder.find_association_reflection(association)
SimpleForm :: FormBuilder的相关部分:
f.association :priority_type do |p|
p.input :something
end
正如您所看到的那样,传递一个块会导致它在到达有问题的方法之前返回。
至少值得一试?