AJAX не рендерится как следует

Я в растерянности из-за того, что мой код не воспроизводит AJAX там, где он должен быть, у меня есть менее серьезная JS-ошибка "Parse", которую я тоже не могу отработать.

У меня есть по умолчанию rails form_for, где при отправке события jQuery находит элемент и значения его атрибутов, отправляет их в модель с помощью соответствующего действия, модель затем отвечает новым объектом и должна визуализировать JSON через форму jbuilder.

Все в порядке, когда я получаю страницу для рендеринга через перенаправление, но не с помощью рендера 'create', content_type::json, отображаемая ошибка - ошибка отсутствующего шаблона. Из ответа сети также видно, что "не удалось загрузить данные ответов". views/reviews/create.json.jbuilder сохранен в правильном месте, я верю, имена классов и идентификаторов все верны, я верю, файлы и папки названы правильно и в правильном месте, я верю, я не вижу ничего плохого? Не уверены, является ли это ошибкой 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 / restaurant /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

Уже несколько часов пытаюсь решить эту проблему, пффф!! Любая идея, где я иду не так, ребята? Я делаю что-то действительно тусклое где-то здесь? Спасибо.

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 %>

Этот код должен быть выполнен после успешного создания. Вы также должны создать файл с именем reviews/_create.html.erb с HTML, который вы хотите показать. Наконец, вы должны удалить некоторую логику в javascript и в контроллере.

Другие вопросы по тегам