为装饰器创建SimpleForm

时间:2015-03-02 19:04:00

标签: ruby-on-rails simple-form

我有一个可以发送给用户的消息类。直到最近,它才能发送给单个用户,但不是要求发送给多个用户。我决定将消息包装在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?时,我也会触发消息验证器。

1 个答案:

答案 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

正如您所看到的那样,传递一个块会导致它在到达有问题的方法之前返回。

至少值得一试?