rails - 在页面重新加载之前不显示flash消息?

时间:2015-09-28 17:12:27

标签: javascript jquery ruby-on-rails ajax turbolinks

我正在使用rails应用程序中的渲染/重定向,我有以下控制器操作

class MessagesController < ApplicationController

 def create
    @message = Message.new(body: params[:message])
    if @message.save
      head :created
    else
      flash[:notice] = "failed!"
      render "home/index"
    end

  end

这是我的home / index.html.erb文件

<% if flash[:notice] %>
    <div class="notice"><%= flash[:notice] %></div>
  <% end %>

<form>
  <textarea name="message" id="message" placeholder="Type your message..."></textarea>
  <input type="submit"></input>
</form>

我正在使用jquery提交表单:

$(document).ready(function(){
  $('form').submit(function(e){
    e.preventDefault();
    var message_body = $('#message').val();
    $('#message').val('');
    $('#message').focus();
     $.ajax({
       url:    '/messages',
       method: 'post',
       data:   {message: message_body}
     });
  });
});

我在表单模型中进行了验证,确保邮件正文不能为空validates :body, presence: true

因此,当我创建一个空消息并点击提交时,它会呈现主页/索引模板。 (应该如此)

在Chrome内部,在开发控制台的预览/响应标签中我可以看到flash消息,但是在我的实际应用程序中,我无法看到闪存通知,直到我刷新页面..然后它就会出现。

我是否误解了有关页面呈现方式/ render / redirect_to之间的差异或者这是turbo链接问题?我尝试从我的application.js文件中删除//= require turbolinks并重新启动我的服务器来删除turbo链接..仍然是同样的问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你明确地误解了关于flash_messages如何处理rails的事情。

flash消息是一个用于渲染或重定向(然后渲染)的计时器。

如果您设置了闪光[:notice],下次当rails渲染时,flash_message将可用(并且在它消失后直接)。

因为您要提交表单异步,您应该返回状态,然后在您的ajaxcall中,您可以通过状态代码并为用户提供一些反馈

这样的事情是可能的(未经测试)

ajax({url, method, statusCodes: function() {
 200: function() {
   //success
 },
 500: function() {
  //failure
 }
});

然后在您的控制器内部返回500个http代码和对象的错误

else
  render status: 500, json: {errors: @message.errors}
end

答案 1 :(得分:0)

在玩了一下之后,在答案的帮助下,这就是我解决这个问题的方法:

我的消息控制器:

 def create
    @message = Message.new(body: params[:message])
    if @message.save
      head :created
    else
      render status: 422, json: { errors: @message.errors.full_messages}
    end
  end

我的ajax电话:

$(document).ready(function(){
  $('form').submit(function(e){
    e.preventDefault();
    var message_body = $('#message').val();

    $('#message').val('');
    $('#message').focus();

    $.ajax({
      url:      '/messages',
      method:   'post',
      data:     {message: message_body},

      error: function(data){
        console.log(data);
          var response = jQuery.parseJSON(data.responseText);
          var error_message = response.errors.join("\n");
          alert(error_message);
      }

    }); //end of ajax function 

  });   //end of submit function

});     //end of document.ready