Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails PORO presenter中断url帮助程序_Ruby On Rails_Ruby_Mvp - Fatal编程技术网

Ruby on rails PORO presenter中断url帮助程序

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)

我已经开始使用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)
    @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