1

У меня есть вызов 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

ответ

2

"#{}" используется для строковой интерполяции в Coffeescript, поэтому я предполагаю, что это ошибка. Я предполагаю, что URL-адрес, в который делается этот запрос ajax, равен 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

3

Во-первых, позвольте мне объяснить некоторые вещи для вас:

-

Типы Mime

Rails обрабатывает mime-types в уровень контроллера (не промежуточное ПО).

Это означает, что если вы хотите запросить ресурс с помощью типа mime ajax js, вам нужно будет определить его обработку в контроллере, а не структуру маршрутов.

Вы сможете узнать больше о том, как 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 

Это позволяет создавать/вызывать различные ответы, которые вы хотите, в зависимости от типа пантомимы вы посылаете до контроллера.

-

Ajax

В отношении вызова Ajax, вы должны знать, что вы не должны использовать любое динамическое связывание в вашем трубопроводе активов. Я знаю, что документация Rails рекомендует в противном случае, но факт заключается в том, что если вы обслуживаете статические активы (как это рекомендуется в процессе производства), вы потеряете возможность называть эти маршруты.

Конечно, как Ahmed предложил, вы можете рассчитывать на coffeescript или erb предварительной обработки, чтобы позволить вам использовать маршрут, как вы хотите:

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

Это будет маршрут Ваш Javascript запрос, что позволяет обрабатывать mime в контроллере по мере необходимости.

+0

Похоже, это отличное решение, но я получаю 'неопределенная локальная переменная или метод 'order_links_groups_path' для # <# <Класс: 0x00000004ce04b0>: 0x000000051bbc50> (в/home/durrantm/Dropnot/webs/rails_apps/linker/app/активы/JavaScripts/sortable_hook.js.erb) '. Я также попробовал 'order_links_groups_url' и получил ту же ошибку. –

+0

btw Я изменил контроллер, добавив блок формата. –

+0

fyi Я использую '.js.erb' Будет ли' url: <% = order_links_groups_path%> 'быть одинаковым для шаблонов .js.erb' (ваш пример для coffeescript)? –

Смежные вопросы