资产管道中的路由助手

Posted

技术标签:

【中文标题】资产管道中的路由助手【英文标题】:Route helpers in asset pipeline 【发布时间】:2011-10-07 05:25:16 【问题描述】:

使用 Rails 3.1.0.rc4,我正在尝试访问 javascript 文件(在本例中为 event.js.erb)中的路由帮助程序,并且当时似乎没有加载它们。请求合并的 /assets/application.js 文件时,我得到:

throw Error("NameError: undefined local variable or method `events_path' for #<#<Class:0x00000001580010>:0x00000003191510>\n  (in /<...>/app/assets/javascripts/event.js.erb)")

知道如何访问其中的路由助手吗?

【问题讨论】:

我在 Rails 3.1 稳定版中遇到了同样的问题。有人知道如何解决这个问题吗? 【参考方案1】:

更新:现在有一个可以为您执行此操作的 gem:js-routes


问题在于 Sprockets 正在评估您的 Rails 应用程序上下文之外的 ERB,而您所期望的大部分内容都不存在。

您可以像这样将内容添加到您的 Sprockets 上下文中:

Rails.application.assets.context_class.class_eval do
  include Rails.application.routes.url_helpers
end

这一切都很好,但是让需要 id 的助手工作有点棘手。我将使用一种称为URI Template 的技术:

var event_path = "<%= CGI.unescape event_path('event_id') %>";

它返回/events/event_id,您可以使用 event_id: 1 之类的对象将其呈现为url。请参阅 SugarJS 的 String#assign 方法作为示例实现。你也可以像我一样roll your own。

【讨论】:

唷,原谅这么晚的接受。听起来很合理,谢谢! 太棒了!正是我想要的! @MildFuzz 这是你在创建项目时给它起的名字。如果您不记得,请查看config/application.rb 有更好的方法吗?我用这个::Rails.application.routes.url_helpers.new_user_session_path @Nick 老实说我无法想象这会成为一个问题。【参考方案2】:

您可以将文件移动到可以访问适当上下文的视图中,然后将其从 JS 源标记拉到客户端。如果您正在编写引擎,参考 MyRailsApp::Application.routes.url_helpers 可能不是最好的。

【讨论】:

你可以做 [EngineName]::Engine.routes.url_helpers

以上是关于资产管道中的路由助手的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败

路由器刷breed Web控制台助手v4.0版本刷机求助

我应该在路由逻辑或 Meteor 模板助手中提供数据吗?

MVC5-2 MVC的管道流与路由

mvccontrib 测试助手和验证 http post 路由和参数

Asp.Net MVC的路由