【问题标题】:AJAX not rendering as it shouldAJAX 未按应有的方式呈现
【发布时间】:2014-12-29 17:25:40
【问题描述】:

我不知道是什么阻止了我的代码没有将 AJAX 渲染到应有的位置,我有一个不太严重的 JS“解析错误”,我也无法解决。

我有一个默认的阻止 rails form_for 在提交事件时 jQuery 找到元素及其属性值,通过适当的操作将它们发布到模型,然后模型用新对象响应并应该通过 jbuilder 表单呈现 JSON .

当我通过重定向而不是通过渲染“创建”来渲染页面时,一切都很好,content_type::json,显示的错误是缺少模板错误。我还从网络响应中看到它“无法加载响应数据”。 views/reviews/create.json.jbuilder 保存在正确的位置我相信,类和 id 名称都是正确的我相信,文件和文件夹的命名正确并且我相信在正确的位置,我看不到任何错误?不确定是 jbuilder 错误、控制器语法错误还是 jQuery 语法错误。这是我的代码:

controllers/reviews_controller.rb:

def create
    @restaurant = Restaurant.find(params[:restaurant_id])
    @review = @restaurant.reviews.new(params[:review].permit(:thoughts, :rating))

    if @restaurant.reviews.find_by user_id: current_user.id
      flash[:notice] = "You already reviewed this restaurant!" 
      redirect_to restaurants_path
    else
      @review.user = current_user
      @review.save 
      # redirect_to restaurants_path, will do a redirect, but defeats AJAX purpose!
      render 'create', content_type: :json # results in a missing template error #'missing templete reviews/create' error
    end
  end

资产/餐厅/restaurants.js:

$(document).ready(function(){
  $('.new_review').on('submit', function(event){
    event.preventDefault();
    var reviewList = $(this).siblings('ul');
    var currentRestaurant = $(this).parent();
    $.post($(this).attr('action'), $(this).serialize(), function(review){
      if review # This line results in Uncaught SyntaxError: Unexpected Identifier
      var newReview = Mustache.render($('#review_template').html(), review);
        reviewList.append(newReview);

        currentRestaurant.find('.review_count').text(review.restaurant.review_count)
        currentRestaurant.find('.average_rating_number').text(review.restaurant.average_rating);
        currentRestaurant.find('.average_rating_stars').text(review.restaurant.average_rating_stars);
    }, 'json');
  });
});

views/restaurants/index.html.erb(jbuilder 模板元素):

<template id='review_template'>
  <li>
    <strong>{{ star_rating }}</strong> -*- {{ thoughts }}
  </li>
</template>

views/reviews/create.json.jbuilder:

json.thoughts @review.thoughts
json.star_rating star_rating(@review.rating)

json.restaurant do
  json.average_rating number_with_precision(@restaurant.average_rating,
  precision: 1)
  json.average_rating_stars star_rating(@restaurant.average_rating)
  json.review_count pluralize(@restaurant.reviews.count, 'reviews')
end

为了解决这个问题已经花了好几个小时了,噗!!知道我哪里错了吗?我在这里的某个地方做了什么很暗淡的事情吗?谢谢。

【问题讨论】:

  • 如果有服务器发送的错误信息,能否给出?
  • 确切的错误消息是:缺少模板评论/创建,应用程序/创建与 {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}。在以下位置搜索:*“/Users/james/Makers/week8/yelp/app/views”*“/Users/james/.rvm/gems/ruby-2.1.5/gems/devise-3.4.1/app/views”
  • 无论 jbuilder 模板在那里,views/reviews/create.json.jbuilder。请注意,当使用重定向“/restaurants”语法(上面注释掉)时,chrome 控制台中的网络响应不会加载任何数据。使用重定向“/restaurants”时,会创建对象,并通过整页刷新显示。只是没有通过 json 显示。

标签: ruby-on-rails ajax json jbuilder


【解决方案1】:

正如您在错误消息中看到的,rails 正在寻找一个名为 reviews/create[extension]application/create[extension] 的文件,并且允许的扩展名是 .erb, .builder, .raw, .ruby, .coffee or .jbuilder

我建议将你的ajax调用改为请求js,而不是json,创建一个名为reviews/create.js.erb的文件,并添加这样的代码:

<% if @restaurant.reviews.find_by user_id: current_user.id %>
  // do the code to show the error message in javascript
<% else %>
  reviewList.append("<%= j(render('create')) %>");
  currentRestaurant.find('.review_count').text(<%= pluralize(@restaurant.reviews.count, 'reviews') %>)
  currentRestaurant.find('.average_rating_number').text(<%= number_with_precision(@restaurant.average_rating, precision: 1) %>);
  currentRestaurant.find('.average_rating_stars').text(<%=star_rating(@restaurant.average_rating) %>);
<% end %>

此代码应在创建成功后执行。您还必须使用要显示的 html 创建一个名为 reviews/_create.html.erb 的文件。最后,您必须删除 javascript 和控制器中的一些逻辑。

【讨论】:

  • 感谢豆鬼的建议。在玩了很多游戏之后,我现在已经将它完全隔离到了 restaurant.js 文件中的 if 语句(第 7 行以下)。在删除 if 语句的同时,一切都返回到应该通过 JS/AJAX 运行。我唯一需要解决的是restaurants.js 中的条件语句,这样如果current_user 已经在restaurant 模型中创建了一个评论对象,它就不会进行Mustache 渲染。我认为条件语句可能需要在它自己的函数中。关于我如何正确执行此操作的任何建议?
  • 您应该在返回的数据中有一个值,表明是否有评论。我更喜欢在.js.erb 文件中包含回调,但它如您所愿。
猜你喜欢
  • 2022-01-17
  • 2019-09-18
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多