我正在使用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链接..仍然是同样的问题。
有什么想法吗?
答案 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