AJAX不能正常渲染

时间:2014-12-29 17:25:40

标签: ruby-on-rails ajax json jbuilder

我不知道是什么阻止我的代码不能将AJAX呈现在应有的位置,我有一个不那么严重的JS'Parse错误',我也无法解决这个问题。

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

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

控制器/ 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>

视图/评论/ 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

现在试着解决这个问题几个小时了,pfff !!我知道我哪里错了人吗?我在这里做某事真暗吗?谢谢。

1 个答案:

答案 0 :(得分:0)

正如您在错误消息中看到的,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和控制器中的一些逻辑。