2012-10-10 66 views
3

我正在嘗試在rails中發出ajax請求。我想要做的就是從我的javascript調用控制器中的一個動作,而不必爲它創建一個視圖頁面。例如在沒有視圖的控制器中的動作(對於AJAX)

class BooksContoller < ApplicationController 
    respond_to :html, :json, :xml 

    def myaction 
    respond_to do |format| 
    format.js { # do stuff } 
    end 
    end 

end 

在routes.rb中文件中添加以下

match '/books/myaction' => 'books#myaction' 

這裏的Ajax調用,我做

$.ajax(
{ 
    type: "GET", url: "/books/myaction.js", 
    success: function(data){ 
    console.log(data); 
    } 
}); 

Rails的抱怨沒有找到視圖

ActionView::MissingTemplate with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee, :haml]} 

顯然,如果我創建一個相應的myaction.html.haml文件,它很高興,一切正常。但是我不想爲這個動作創建一個視圖,因爲這隻會用於ajax請求。有沒有辦法讓ajax調用自定義操作而不創建視圖?

+0

是因爲你迴應:json但使用.js作爲擴展名嗎? –

+0

@ s-c你能找到解決方案嗎?我在Rails 3.2.14中遇到了完全相同的問題。我只需要一個控制器中的一個動作,它返回一個json字符串,然後傳遞給jqplot來繪製圖形。沒有涉及的意見。 我甚至嘗試使用「render:text => data,:content_type =>'application/json'」。但仍然有同樣的錯誤。 – Srinidhi

+0

請忽略。我能夠解決我的錯誤。我正在使用CanCan進行授權/訪問控制,並且在仔細查看堆棧跟蹤之後,在cancan的AccessDenied檢查開始後,「Actionview :: MissingTemplate」被引發。如果我​​登錄並訪問我新創建的操作,則一切正常。我還將我的新操作添加爲CanCan的load_and_authorize_resource的異常。 – Srinidhi

回答

0

你只需要把render :json => {:example => :object}放在最後。例如:

def myaction 
    respond_to do |format| 
    format.js do 
     # do stuff 
     render :json => {:result => :of_stuff} 
    end 
    end 
end 

當然,如果你知道你只用這個AJAX請求,那麼你就可以完全跳過的respond_to(這將允許您調用URI的有或無.js):

def myaction 
    render :json => {:result => :of_stuff} 
end 
0

你有respond_to:html,我敢打賭,你的javascript沒有設置「Accept:application/json」。從類級別和方法中刪除respond_to。

相關問題