4

在我的Rails 3.2应用程序(Ruby 1.9)中,当在Coffeescript中使用路径助手时,出现以下错误。Rails path-helpers在js.coffee.erb中不起作用

undefined local variable or method `new_user_session_path' 

在我的部分_usermenu.html.haml工作正常:

= link_to t('user.login'), new_user_session_path 

在我的应用程序/资产/ JavaScript的/ metamenu.js.coffee.erb上述错误抛出:

$.get("<%= new_user_session_path %>") 

是不是可以在coffeescript erb中使用x_path和x_url助手?

回答

11

这是因为您不在资产内的视图上下文中。在文件中添加一个erb扩展并不会改变这个,它只是允许你评估嵌入式ruby。

如果这是一次性场景,最好的办法就是简单地使用字符串本身。

$.get("/sign_in") 

如果你真的想你可以创建一个部分是输出脚本标记输出的辅助方法,到JS变量和访问他们的方式。

# in your layout 

<%= render 'url_helpers' %> 

# in app/views/layouts/_url_helpers.html.erb 

<script> 
    window.new_user_session_path = "<%= new_user_session_path %>"; 
    # add more if necessary 
</script> 

# in your coffeescript 

$.get(@new_user_session_path) 

另外值得牢记这显然从不为成员的工作路线在您传递模型的URL帮手的实例作为那绝对是不可用的CoffeeScript。请记住,在生产资产中进行了预编译,因此不能动态地使用任何东西。为此,您只能真正依靠在控制器中设置操作来响应JS调用。

+0

非常感谢!这绝对有道理!我错过的只是一个很好的解释... :-) – 2013-02-26 19:29:46

+0

关于预编译资产和使用任何动态的东西,你能否扩展你的评论?我正在尝试(徒劳无功,迄今为止)使用AJAX调用来更新正在我的主页上呈现的图像。当#home被击中时,变量玩家被设置为一个玩家对象,并且每个玩家都有一个相应的图像被保存到/资产并且具有该玩家的名字的标题。当AJAX调用更新播放器的值时,我想更新主屏幕上显示的图像以对应@player的新值。我可以使用jQuery来插入带有图片标签的HTML吗?谢谢! – jackerman09 2013-10-15 18:16:24

+0

来自未来的另一个注意事项...您也可以在视图中添加数据元素(如数据路径),然后在js文件中抓取它。 – Jeff 2015-08-19 14:21:28

4

旧帖子,但仍可从Google访问。

在轨道4(当然至少也3),你可以使用路由助手轻松插入你的js文件:

资产/ JavaScript的/ my_file.js.coffee.erb

<% self.class.include Rails.application.routes.url_helpers %> 
window.index_route = '<%= index_path %>'