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 и в контроллере.