我有一个运行Rails 2.3.5的应用程序,其中包含大部分JSON API。
一位承包商进来并在应用程序上做了一些工作,并在一些地方使用了RJS。对主网站使用RJS的一些控制器操作也需要成为API的一部分。
问题是JSON API请求会触发RJS响应,这不是我想要的。我希望RJS响应发生在浏览器中,但是当它是一个API请求时(通过使用“application / json”Accept和Content-Type标头区分),我希望它只是发送API响应。
据我所知,Rails会触发任何涉及javascript的MIME类型的RJS响应,即
文本/ JavaScript的 应用/ JSON
等
有没有办法强制RJS只响应text / 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 :(得分:1)
你需要在你的mime_types.rb中定义json然后你应该能够这样做:
def show
@dashboard = @user.dashboard
respond_to do |format|
format.html
format.json {render :json => @dashboard}
format.js
end
end
更多内容请点击此处:http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/
答案 1 :(得分: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)“render:json”设置对application / json的响应的内容类型。
答案 2 :(得分: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
});
});