【问题标题】:Controller action does not display errors and I cannot see whats wrong控制器操作不显示错误,我看不出有什么问题
【发布时间】:2015-02-26 21:33:12
【问题描述】:

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

在过去的几天里,我一直在玩很多不同的语法,以更好地理解这一点并尝试让事情按我的意图工作,我似乎在某些配置下可以很好地呈现错误,但是对于我的生活我现在不能回到那里。我认为这与控制器语法有关。有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您正在使用 AJAX 来调用您的 create 操作,并且在您的 $.post 函数中您将其配置为接收 'json' 因此,您只能从 create 接收 json行动。因此,您不能在该操作中执行redirect_to。相反,您必须将错误返回为 json,并在您的 $.post 函数中处理该响应。

    您在服务器日志中没有看到任何内容的原因是$.post 函数将忽略响应,因为它不是json。它不知道如何处理它,所以它默默地失败了。

    【讨论】:

    • 感谢您让我看到这个 Diego。我想我需要将响应标头的“Content-Type”更改为 application/json,使用如下语法:“Content-type”、“application/json”。你能告诉我应该怎么做吗?再次感谢您帮助新手。
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多