【问题标题】:Outputting jSON in a rails app在 Rails 应用程序中输出 JSON
【发布时间】:2010-09-26 16:52:35
【问题描述】:

好的,rails 3 新开发者在这里。

我希望我的 jquery 能够从项目的 rails 3 应用程序中获取 json 对象。这是我的控制器。

def yourprojects
  @projects = Projects.all(current_user)

  respond_to do |format|
    format.html # index.html.erb
    format.json  { render :json => @projects }
  end
end

我在 jquery 中添加了 format.json 行...我有:

$.ajax({url: '/projects/yourprojects', dataType: 'json'});

所以我认为这应该可行。相反,服务器正在返回:“模板丢失”“缺少模板,,,, 带有 {:locale=>[:en, :en], :handlers=>[:rjs, :rhtml, :builder, :rxml, : erb], :formats=>[:html]} 在视图路径中"

你需要一个 jsOn 返回的模板吗? rails 3 app不应该知道如何格式化json吗?

路线文件:

resources :projects do
    collection do
        get 'yourprojects'  
    end
end

【问题讨论】:

    标签: jquery ruby-on-rails json ruby-on-rails-3


    【解决方案1】:

    您可以为真正的 REST 设置 Accept: application/json 标头,或者您可以将格式添加到 URL 以便快速破解:

    $.ajax({url: '/projects/yourprojects.json', dataType: 'json'});
    

    【讨论】:

    • 这太棒了——而且奏效了!哇,谢谢。我在 Google 上的任何地方都找不到这个!我喜欢使用接受的想法,现在我的 JS 文件顶部有这个 ($.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript") } })) .... 问题是一些 ajax 请求我需要一个 .js 响应。其他我想要 JSON。处理这个问题的聪明方法是什么?谢谢!
    【解决方案2】:

    这不是 Rails 的问题,而是 AJAX / jQuery 未发送 Accept 标头: 试试这个:

    $.ajax({
       url: 'url_to_action', dataType: "json",
         beforeSend : function(xhr){
           xhr.setRequestHeader("Accept", "application/json")
         },
         success : function(data){
           //.. do something with data
         },
         error: function(objAJAXRequest, strError, errorThrown){
           alert("ERROR: " + strError);
         }
      }
    );
    

    如果您的所有 AJAX 请求都需要 JSON,那么您可以全局设置标头:

    $.ajaxSetup({
      dataType: 'json',
      'beforeSend' : function(xhr){
        xhr.setRequestHeader("Accept", "application/json")
      } 
    });
    

    其他选项是将.json 添加到路径或data:{format: 'json'}$.ajax 选项哈希。 Rails 默认支持resoures 路由的格式路径后缀。试试rake routes看看吧。

    【讨论】:

      【解决方案3】:
      :formats=>[:html]
      

      这表示服务器认为正在请求html。尝试将.json 添加到您的路径(和可能的路线)中,这将强制格式。要做到这一点,需要这样的路线:

      map.your_projects '/projects/yourprojects.:format',
        :controller => 'projects',
        :action => 'yourprojects'
      

      不知何故,对于这个请求,params[:format] 应该是 "json",以便格式处理程序可以做正确的事情。

      【讨论】:

      • 感谢 Squeegy,但这是为 Rails 3 准备的吗?我的配置/路线看起来像这样以适应(也添加到上面的问题中):资源:projects do collection do get 'yourprojects' end end
      • 另外,我认为 Rails 3 足够聪明,可以确定请求类型并提供正确的响应,即为什么你可以有这么多不同类型的响应类型(html、js、json、xml)?
      • 我实际上有点落后,不确定 Rails 3 路由是如何工作的。但是 2.x 就像我描述的那样工作。对不起!
      • 感谢我在网上找到的,它在 Rails 3 中完全不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多