我正在创建一个Rails应用程序,我希望能够使用传递给视图的模型对象来获取此对象上某些操作的URL,例如:
link_to object.public_send(attribute),
{ :controller => object.controller_path,
:action => :show,
:id => object.id }
这样做的好方法是什么?是否可以使用像Draper这样的装饰器来完成?网上有一些例子吗?
更新。我已经考虑过这个并决定装饰器不是保存控制器信息的好地方。这不是装饰者的责任。装饰者应该只知道使用标记呈现格式化数据。现在我已经创建了一个名为Accessor
的模块,我尝试将模型与控制器和路由感知混合在一起。我仍然想知道是否有更好的方法。
答案 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
应用为具有各种功能的装饰器。