如何在不渲染或重定向的情况下显示消息(又名flash)



表单提交后,我的控制器检查是否存在某些条件。就我而言,有三种:

  1. 如果用户能够最大限度地丰富其物体跟踪的可能性
  2. 如果用户已经跟踪此对象
  3. 一切正常,请求被添加到队列中

我想通知用户这些情况。我有remote: true的表单,现在我通过渲染js: "alert('info')"来显示信息,但它看起来很难看。我不想将用户重定向到某个位置,也不想在表单提交后重新提交表单。我只想显示"flash"消息,然后等待用户的另一个请求。我该怎么做?

  1. 简单方法:

在表单页面的顶部,有一个div来存储消息:

在控制器中远程请求的请求处理程序中,计算要显示的消息。

def create
  ...
  @message = get_message
  ...
end

由于这是一个ajax请求,您的视图将是一个.js.erb文件(假设您使用的是erb)。在该视图中,只需将消息div内容设置为@message:

# create.js.erb
$('#message').text("#{@message}");
  1. 高级方法:

或者,如果您想要更丰富的格式,请为消息格式创建一个分部,并在js.erb文件中呈现它。

例如,我使用bootstrap作为我的样式,我可以使消息看起来像一个带有"x"的警报来关闭它,所以我创建了一个分部来呈现警报:

# views/home/_message.html.erb
<div class='alert alert-warning alert-dismissible'>
  <%= message %><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>   
</div>

在你的js.erb中,你可以这样做,

# create.js.erb
$("#message").html("<%= escape_javascript(render partial: 'home/message', locals: { message: @message } ) %>"); 

如果您想使用remote ajax请求,您需要在前端自己处理响应。如果你想让它看起来漂亮,你需要在页面上设计一个弹出模式窗口或某种显示块来显示消息。默认为style='display:none'

然后,您需要编写一个JS方法来显示它并返回该方法。像这样的东西。(假设您使用的是jQuery)

$('#messageblockid .content').text("your message goes here");
$('#messageblockid').show();

最新更新