如何让模型知道Rails中的控制器?

时间:2012-10-03 17:31:49

标签: ruby-on-rails decorator

我正在创建一个Rails应用程序,我希望能够使用传递给视图的模型对象来获取此对象上某些操作的URL,例如:

link_to object.public_send(attribute),
        { :controller => object.controller_path,
          :action     => :show,
          :id         => object.id }

这样做的好方法是什么?是否可以使用像Draper这样的装饰器来完成?网上有一些例子吗?


更新。我已经考虑过这个并决定装饰器不是保存控制器信息的好地方。这不是装饰者的责任。装饰者应该只知道使用标记呈现格式化数据。现在我已经创建了一个名为Accessor的模块,我尝试将模型与控制器和路由感知混合在一起。我仍然想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:0)

如果你不介意在你的视图上有另一个实例变量,你可以使用一个非常简单的类来实现它(不需要装饰器)。

class MyRouter
  def initialize(controller, object)
    @controller = controller
    @object     = object
  end

  def url_for(action_name)
    controller.url_for(object, :action => action_name)
  end
end

在您的控制器上:

class AController
  def edit
    @router = MyRouter.new(self, object)
    render 'shared_view'
  end
end

class BController
  def edit
    @router = MyRouter.new(self, object)
    render 'shared_view'
  end
end

在您的共享视图中:

<%= @router.url_for(:show) # Varies with the controller that rendered the view %>

当然,这假定您想要作为目标的控制器是渲染视图的同一个控制器,这可能不是真的。尽管如此,使用此模式可以容纳更复杂的逻辑,以满足您的需求(例如,有多个Router类),而无需更改视图。

答案 1 :(得分:0)

我在Avid Grimm的Objects on Rails中找到了一个非常有趣的解决方案:Exhibits for REST。简而言之,他的想法是将多个Ruby的SimpleDelegator应用为具有各种功能的装饰器。