2010-02-26 64 views
1

我有一個運行Rails 2.3.5的應用程序,它有很多JSON API。如何覆蓋Rails 2.3中的RJS MIME類型?

承包商進來了,在應用程序上做了一些工作,並在幾個地方使用了RJS。一些使用RJS作爲主要網站的控制器操作也需要成爲API的一部分。

問題是JSON API請求觸發RJS響應,這不是我想要的。我希望RJS響應發生在瀏覽器中,但是當它是一個API請求(通過使用「application/json」Accept和Content-Type標頭進行區分)時,我希望它只發送API響應。

從我可以告訴,Rails的觸發任何MIME類型包括JavaScript的一個RJS響應,即

文/ JavaScript的應用程序 /JSON

有沒有一種辦法強制RJS只響應文本/ JavaScript?還是有更好的方法來解決這個問題?

爲了使它更清楚,我有一些代碼,看起來像這樣:

def show 
    @dashboard = @user.dashboard 
    respond_to do |wants| 
    wants.html 
    wants.json { render :json => @dashboard } 
    end 
end 

麻煩的是,也有在該控制器視圖文件夾show.rjs模板。當有人點擊API時,我想讓它呈現json結果,就像我上面列出的那樣,但是它會呈現show.rjs模板。

如何確保API客戶端能夠獲得我想要的json結果,並仍然讓RJS模板爲網站上的人員呈現?

回答

0

在你的控制器的操作嘗試以下操作:

def index 
    respond_to do |format| 
    format.html # Renders index.html.erb as usual 
    format.xml { render :json => {:name => "raskchanky"}.to_json } 
    end 
end 

根據Rails文檔(http://api.rubyonrails.org/classes/ActionController/Base.html) 「渲染:JSON」 設置響應爲application/JSON的內容類型。

0

你確定你的JavaScript在發送正確的標題?當我做rjs時,通常我會通過響應format.js來做到這一點。這使我可以輕鬆分開json和js響應。

通常,我的問題一直在確保我的ajax操作實際上以正確的格式發送請求。如有疑問,您可以添加'format':'js'參數到您的請求。在jQuery中:

// try to get it to figure out rjs actions by itself 
$('a').click(function(e){ 
    e.preventDefault(); 
    $.get({ 
    url: this.attr('href'), 
    dataType: 'script', 
    success: responseFunction 
    }); 
}); 

// or force the format 
$('a').click(function(e){ 
    e.preventDefault(); 
    $.get({ 
    url: this.attr('href'), 
    data: {format: 'js'}, 
    success: responseFunction 
    }); 
});