我可以使用js ajax调用的路径路径吗?

问题描述:

我有一个Ajax调用在.js文件,该工程使用:我可以使用js ajax调用的路径路径吗?

... 
update: function(){ 
    $.ajax({ 
    url: '/groups/order_links', 
... 

,但我宁愿使用路由路径

我发的文件扩展名.js.erb和我尝试添加:

... 
update: function(){ 
    $.ajax({ 
    url: "#{order_links_groups_path}", 
    ... 

 ... 
    url: "#{order_links_groups_url}", 
    ... 

但我在任何情况下得到一个404 - [HTTP/1.1 404 Not Found 76ms]
POST http://localhost:3000/groups/49

rake routes显示了我的路线包括:

    ... 
        PUT  /groups/:group_id/links/:id(.:format)  links#update 
        DELETE /groups/:group_id/links/:id(.:format)  links#destroy 
order_links_groups POST  /groups/order_links(.:format)    groups#order_links 
      groups GET  /groups(.:format)       groups#index 
        POST  /groups(.:format)       groups#create 
     new_group GET  /groups/new(.:format)      groups#new 
     edit_group GET  /groups/:id/edit(.:format)     groups#edit 

它们与定义:

resources :groups do 
    resources :links 
    collection do 
    post 'order_links' 
    end 
end 

groups_controller

class GroupsController < ApplicationController 

    ... 
    def order_links 
    params[:link].each_with_index do |id, index| 
     Link.where(id: id).update_all(['position = ?',index+1]) 
    end 
    render :nothing => true 
    end 
    ... 

Rails 4.1

"#{}"用于Coffeescript中的字符串插值,所以我假设这是一个错误。我假设这个ajax请求的url是http://localhost:3000/groups/49,因为如果你没有传递正确的url,那么它将使用当前路径。

"<%= order_links_groups_path %>"会在红宝石中寻找变量。这将工作,但资产目录中的JavaScript文件正在编译而不使用您的应用程序上下文。含义order_links_groups_path将是未定义的。

这里的答案应该有所帮助:Route helpers in asset pipeline

<% url = MyRailsApp::Application.routes.url_helpers %> 
url: "<%= url.order_links_groups_url %>" 
+0

我确认这适用于Ruby on Rails 4.1应用程序。 – Ahmed 2014-08-31 13:52:14

首先,让我解释一些事情你:

-

MIME类型

的Rails在处理mime-types控制器级(不是中间件)。

这意味着如果您想通过ajax的js mime类型请求资源,则必须在控制器中定义其处理,而不是路由结构。

您可以了解更多关于Rails的是如何处理的MIME类型here

如果客户想HTML,我们只是重定向他们回到人 列表。如果他们想要JavaScript,那么这是一个Ajax请求,我们将与此操作关联的JavaScript模板呈现。最后,如果 客户想要XML,我们渲染的创建人如XML,但有 转折:我们也包括人的公司在渲染XML,所以 你喜欢的东西......

这也就是说,如果你正在寻找处理JS的反应,你就可以做到以下几点:

#app/controllers/groups_controller.rb 
class GroupsController < ApplicationController 
    def order_links 
     ... 
     respond_to do |format| 
     format.js 
     format.html 
     end 
    end 
end 

这允许你创建/调用你想要的各种反应,这取决于你发送MIME类型,直到控制器。

-

阿贾克斯

在关于Ajax调用,你需要知道,你不应该在你的资产管道使用任何动态链接。我知道Rails文档建议,否则,但事实是,如果您提供静态资产(如生产中推荐的那样),您将失去调用这些路由的能力。

当然,作为Ahmed建议,你可以依靠coffeescripterb预处理,使您可以为您希望使用的路线:

#app/assets/javascripts/application.js.coffee 
update: function(){ 
    $.ajax({ 
    url: <%= order_links_groups_path %>, 
    ... 

这将路由你的JavaScript的要求,让您处理按需要键入控制器。

+0

似乎是一个很好的解决方案,但是我正在为#:0x000000051bbc50> (在/ home/durrantm/Dropnot/webs/rails_apps/linker/app /资产/ Java脚本/ sortable_hook.js.erb)'。我也试过'order_links_groups_url'并得到了同样的错误。 – 2014-08-31 12:33:57

+0

顺便说一句我没有改变控制器,添加格式块。 – 2014-08-31 12:39:34

+0

fyi我正在使用'.js.erb'对于'.js.erb'模板(您的示例适用于coffeescript),'url:'是否相同? – 2014-08-31 12:41:01