我看不出为什么我的错误没有显示在下面的代码中。我有一个1到多人的餐厅,评论都属于用户(设计模型)。当用户发布评论时,将使用在页面上显示新评论对象的回调进行AJAx发布请求。审查控制器创建操作有一个条件,如果restaurants.reviews可以找到与user_id或current_user的审查,它会给出一个flash错误通知和redirects_to / restaurants。所有看起来都很好,如果current_user已经对餐厅进行了审核,并且没有显示任何错误,则不会创建评论,但是错误不会被渲染,尽管服务器日志声明它有:
Rendered restaurants/_review_errors_form.html.erb (0.1ms)
Rendered restaurants/index.html.erb within layouts/application (20.3ms)
Completed 200 OK in 90ms (Views: 86.4ms | ActiveRecord: 2.7ms)
这是我的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'
else
@review.user = current_user
@review.save
render 'create', content_type: :json
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)
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' );
});
});
Application.html.erb会显示错误:
<%= notice %>
<%= alert %>
_review_errors部分所有书面罚款:
<% if @review.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@review.errors.count, "error") %> prohibited this review from being saved:</h2>
<ul>
<% @review.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
在过去的几天里,我一直在玩很多不同的语法,以便更好地理解这一点并尝试按照我的意图使事情正常工作,而且我似乎错误地通过一些配置进行了渲染,但对于我的生活我可以;现在回到那里。这与我认为的控制器语法有关。有什么想法吗?
答案 0 :(得分:1)
您正在使用AJAX拨打create
号码,并在$.post
功能中将其配置为接收'json'
因此,您可以仅从json
操作中获得create
。因此,您无法在该操作中执行redirect_to
。相反,您必须将错误返回json
并在$.post
函数中处理该响应。
除了服务器日志之外,您没有看到任何内容的原因是因为$.post
功能会忽略响应,因为它不是json
。它不知道如何处理它,所以它无声地失败。