我可以使用路由路径进行js ajax调用吗?

时间:2014-08-30 23:58:16

标签: javascript ruby-on-rails ajax ruby-on-rails-4 url-routing

我有一个在.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

2 个答案:

答案 0 :(得分:3)

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

"<%= order_links_groups_path %>"会在ruby中查找变量。这可以工作,但资源目录中的JavaScript文件正在编译而不使用您的应用程序上下文。意义order_links_groups_path将是未定义的。

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

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

答案 1 :(得分:3)

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

-

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

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

当然,正如Ahmed建议的那样,您可以依靠coffeescripterb预处理来允许您根据需要使用该路线:

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

这将路由您的javascript请求,允许您根据需要处理控制器中的mime类型。