2014-08-30 82 views
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中的字符串插值,所以我假設這是一個錯誤。我假設這個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

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調用,你需要知道,你不應該在你的資產管道使用任何動態鏈接。我知道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:<%= order_links_groups_path%>'是否相同? – 2014-08-31 12:41:01

相關問題