控制器动作不显示错误,我看不出什么错

时间:2014-12-30 17:56:08

标签: javascript ruby-on-rails ajax model-view-controller

我看不出为什么我的错误没有显示在下面的代码中。我有一个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 %>

在过去的几天里,我一直在玩很多不同的语法,以便更好地理解这一点并尝试按照我的意图使事情正常工作,而且我似乎错误地通过一些配置进行了渲染,但对于我的生活我可以;现在回到那里。这与我认为的控制器语法有关。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您正在使用AJAX拨打create号码,并在$.post功能中将其配置为接收'json'因此,您可以仅从json操作中获得create。因此,您无法在该操作中执行redirect_to。相反,您必须将错误返回json并在$.post函数中处理该响应。

除了服务器日志之外,您没有看到任何内容的原因是因为$.post功能会忽略响应,因为它不是json。它不知道如何处理它,所以它无声地失败。