0

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

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

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


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

4

2 回答 2

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例如,具有多个类),而无需更改视图。

于 2012-10-03T21:26:24.897 回答
0

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

于 2012-10-27T17:50:33.030 回答