我不知道是什么阻止我的代码不能将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 !!我知道我哪里错了人吗?我在这里做某事真暗吗?谢谢。
答案 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和控制器中的一些逻辑。