Routing Error: No route matches [GET] /image/my_image.png

Routing Error: No route matches [GET] /image/my_image.png

我正在从我的一个模型中生成图像标签,但我无法 Rails 在开发和生产模式下同时创建工作 URL。我从我的一个模型开始:

def traffic_light_icon(size=15)
  image_tag "/assets/#{size}/#{traffic_colour}.png"
end

(我正在使用 include ActionView::Helpers::AssetTagHelper 访问 image_tag。)

这在开发中运行良好,但在生产中,link 未使用适当的哈希值自动更新以从资产管道获取图像。如果我尝试使用

形式
image_tag "#{size}/#{traffic_colour}.png"

相反(正如各种消息来源所暗示的那样),它甚至在开发中都不起作用——我收到一个路由错误(没有路由匹配 [GET] /image/15/amber.png)。

我做错了什么?

基本上,答案是 不要在模型中使用 image_tag,即使您想出了一个 hack 来访问它。为了生成适当的上下文相关 URL,助手需要访问模型中不可用的会话数据。这会导致 Rails 创建一个图像标签,但很糟糕,该标签并非在所有情况下都有效(在我的情况下,在开发中而不是在生产中)。

Railscast 132 中有关于何时以及如何在模型和控制器中使用助手的很好的信息(关于何时不应该使用或何时注意它引起的问题的一些提示)。