1

我有一个运行 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 只响应文本/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 模板为网站上的人们呈现?

4

3 回答 3

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/

于 2010-03-03T15:12:39.560 回答
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。

于 2010-02-26T20:29:30.983 回答
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
  });
});
于 2010-06-30T17:18:23.887 回答