如何在Rails 2.3中覆盖RJS MIME类型?

时间:2010-02-26 17:43:39

标签: ruby-on-rails ruby json api rjs

我有一个运行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模板?

3 个答案:

答案 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
  });
});