Ruby on rails PORO presenter中断url帮助程序
我已经开始使用PORO方法创建我的rails演示者。示例演示者位于Ruby on rails PORO presenter中断url帮助程序,ruby-on-rails,ruby,mvp,Ruby On Rails,Ruby,Mvp,我已经开始使用PORO方法创建我的rails演示者。示例演示者位于app/presenters/band\u presenter.rb中,下面是它的代码: class BandPresenter def method_missing(m, *args, &block) @band.send(m) end def initialize(band) @band = band end def thumb_url(size = :large_s)
app/presenters/band\u presenter.rb中,下面是它的代码:
class BandPresenter
def method_missing(m, *args, &block)
@band.send(m)
end
def initialize(band)
@band = band
end
def thumb_url(size = :large_s)
@band.images[size.to_s] if @band.images
end
end
而且效果很好。但是,如果我在rails url帮助器方法中使用该presenter的实例,就会破坏它们。例如:
@band = Band.find(1)
= link_to @band.name, band
# => /bands/1
@band = @band.find(1)
@band = BandPresenter.new(@band)
= link_to @band.name, band
# => /%23%3CBandPresenter:0x007f9139c50db0%3E/1
这似乎完全合法。我的问题是-我能让我的演示者支持这种使用url帮助程序的方式吗?尝试定义一个to_param方法
class BandPresenter
def to_param
@band.id
end
def model_name
@band.model_name
end
end
另一个可能有帮助的选项是定义响应\u缺失?
,请参见此处:
定义response\u to\u missing
是不够的,OP还应该定义method\u missing
,将缺少的调用“委托”给@band
。另外,您的第一个解决方案也不起作用,因为您不仅应该定义to_param
,而且还应该定义model_name
方法。我看不出我有任何理由从OP复制粘贴代码,当然我的意思是他应该将这些方法添加到他已经存在的方法中(他已经定义了method_missing
). 感谢您对模型名称
的评论,这就是我说“试试”的原因,因为我没有测试它是否足够。您是对的,我没有注意到OP已经定义了方法
。顺便说一句,model_name
应该委托给Band
类,而不是实例,并且BandPresenter
类应该响应它,如下面的示例所示:。为了完整性起见,我添加了model_name
。出于好奇,如果您定义respond_to_missing?
而不定义to_param
,它会起作用吗?
class BandPresenter
def respond_to_missing?(method_name, include_private = false)
@band.respond_to?(method_name, include_private) || super
end
end