我在我的 Rails 应用程序中使用渲染/重定向,我有以下 Controller 操作
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 消息,但是在我的实际应用程序中,我无法看到 flash 通知,直到我刷新页面..然后它才会显示。
我是否误解了页面呈现方式/render/redirect_to 之间的差异,或者这是一个 turbo 链接问题?我尝试通过从我的 application.js 文件中删除 //= require turbolinks
并重新启动我的服务器来删除 turbo 链接。仍然是同样的问题。
有什么想法吗?
最佳答案
您肯定误解了 flash_messages 在 rails 中的处理方式。
Flash 消息是用于呈现或重定向(然后呈现)的一次性计时器。
如果你设置了 flash[:notice] ,下一次 Rails 渲染某些东西时,flash_message 将可用(并且紧接着它就会消失)。
因为你想异步提交表单,你应该返回状态,然后在你的 ajaxcall 中你可以通过状态代码为用户提供一些反馈
这样的事情是可能的(未经测试)
ajax({url, method, statusCodes: function() {
200: function() {
//success
},
500: function() {
//failure
}
});
然后在你的 Controller 中返回一个 500 的 http 代码和对象的错误
else
render status: 500, json: {errors: @message.errors}
end
关于javascript - rails - 在页面重新加载之前不显示 flash 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828390/