【问题标题】:Rails Ajax Unexpected token < in JSON at position 0Rails Ajax Unexpected token < in JSON at position 0
【发布时间】:2017-09-29 15:24:38
【问题描述】:

我希望我的指数像亚马逊一样根据价格下降和价格上升而变化。

现在,我向站点发送了一个 ajax 请求,其中 select 的新值请求数据。该站点从数据库中获取数据并对其进行排序。之后,我的 javascript 使用排序好的图书响应重绘索引页面中的卡片。

但是当我控制台记录结果时,我得到了整个 html 页面。
下面这行代码给了我错误:

var books = JSON.parse(result);

JSON 中位置 0 处的意外标记

我怎样才能只获得@books?
以下是我的代码:

BookController.rb

def index
  if params.dig("book", "title").nil? && params.dig("users", "university").nil?
    @books = Book.where({title: params.dig("book", "title")})
    .joins(:user).where(users: {university: params.dig("users", "university")})
  elsif !params.dig("book", "title").nil? && params.dig("users", "university").nil?
    @books = Book.where({title: params.dig("book", "title")})
  elsif params.dig("book", "title").nil? && !params.dig("users", "university").nil?
    @books = Book.joins(:user).where(users: {university: params.dig("users", "university")})
  else
    @books = Book.all
  end
  case params[:sort]
    when "Price Descending"
      @books.order(price_cents: "DESC")
    when "Price Ascending"
      @books.order(price_cents: "ASC")
    else
      @books.sort_by(&:created_at)
  end
  respond_to do |format|
    format.html
    format.json { render json: @books }
  end
end

图书索引.html.erb

<select id="priceSelect">
  <option value="Best Results" selected="selected">Best Results</option>
  <option value="Price Descending">Price Descending</option>
  <option value="Price Ascending">Price Ascending</option>
</select>
.
.
.
<div class="books-info">
  <% @books.each do |book| %>
    <div class="col-xs-12 selectable-card">
      <%= link_to book_path(book.id) do %>
        ...   
      <% end %>
    </div>
  <% end %>
</div>

<script>
  $('#priceSelect').change(function(){
    $.ajax({
      url: "books",
      type: "GET",
      data: {sort: $('#priceSelect :selected').val()},
      success:function(ret){
        console.log(ret);
        var books = JSON.parse(ret);
        var length = books.length;
        var html = "";
        for (var i = 0; i < length; i++) {
          html += "<div class='col-xs-12 selectable-card'>";
          html += "<a href='" + books[i].id + "'>" + books[i].name + "</a>";
          html += "</div>";
        }
        $('.books-info').innerHTML = html
      },
    })
  });
</script>

最后是我的 routes.rb

resources :books do
  resources :users
end

【问题讨论】:

  • 错误意味着响应包含 XML 或 HTML,而不是您告诉它期望的 JSON
  • 是的,它给了我整个 html ......但这真的很奇怪,因为它不应该只从我的@books 中获取对象吗因为我说从 BooksController.rb 获取索引?

标签: javascript jquery ruby-on-rails ajax


【解决方案1】:

我认为您在 Ajax 请求中缺少接受标头,因此您实际上是在重新获取 HTML 页面。

试试:

$.ajax({
  dataType: 'json',
  ...
});

【讨论】:

  • 好的,我这样做了,错误更改为 Uncaught SyntaxError: Unexpected end of JSON input。这是否意味着我的控制器或 javascript 代码中有语法错误?此外,如果我 console.log(ret) 它给了我一个长度 = 0 的数组 [ ]
  • 当我只是做 var books = ret;它没有给我任何错误。但它说数组的长度是 0。我从 Aditya Mittal 的回答中得到了建议:stackoverflow.com/a/33489715/1438029
  • 听起来您的查询有问题。尝试在那里调试代码,以确保您实际上从数据库中获取了任何内容。
  • 我发现如果我在 case params[:sort] 中打印我的@books,它会告诉我 books 只是 [ ] 空的。 params[:sort] 给了我所需的“价格降序/升序”。我认为问题在于它只是告诉我它是空的。当我更改选择的值时,这就是 sql 所说的: SELECT "books".* FROM "books" INNER JOIN "users" ON "users"."id" = "books"."user_id" WHERE "books" ."title" 为 NULL 并且 "users"."university" 为 NULL
  • 如果标题为 nil,您可能不应该将其包含在 where 语句中。大学也是如此。
【解决方案2】:

改变这个

 respond_to do |format|
   format.html
   format.json { render json: @books }
 end

到:

render json: {data: @books}

【讨论】:

  • 天气越来越暖和了。当我这样做时,整个 html 都消失了,但它显示了我真正想要的所有 @books 对象。在右上角我可以在 raw 和 parsed 之间切换
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 2021-09-30
  • 1970-01-01
  • 2017-12-15
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多