【问题标题】:How do I override the RJS MIME Type in Rails 2.3?如何在 Rails 2.3 中覆盖 RJS MIME 类型?
【发布时间】:2011-01-21 13:33:13
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    在您的控制器的操作中尝试以下操作:

    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】:

      您需要在 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/

      【讨论】:

        【解决方案3】:

        您确定您的 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-09-10
          • 2011-03-02
          • 1970-01-01
          • 2016-08-23
          • 2022-08-06
          • 1970-01-01
          • 2011-02-20
          • 1970-01-01
          相关资源
          最近更新 更多