这次来显示 Login 失败信息。采用 flash 来实现,中文意思是“闪一下”。参考 这里 的 5.2 部分。

flash 和 session 这两个方法的区别

session[:xxx] 中存储的数据会一直保留,直到你把网站关闭。而 flash[:xxx] 中存放的数据只是在 你下一次请求中可以取得,然后就自动被清空了。

实际操作来看一下。

到 users_controller.rb 的 create_login_session 方法中,这里提一句,controller 里的一个方法, 通常都对应一次请求动作,所以 rails 下通常英文叫做 action 。这里咱们给登陆成功和失败两种情况,都给出反馈信息。

+ flash.notice = "登陆成功!"
  redirect_to :root
else
+ flash.notice = "用户名密码错误!"
  redirect_to :login
end

通过 flash 就可以把当前请求生成的信息传送给下一个请求了。

为了显示 flash 信息,需要到 application.html.erb 中添加

<% if flash.notice %>
  <div class="notice"><%= flash.notice %></div>
<% end %>

这样,当登陆失败,页面重定向到 login 页面的时候,就可以显示信息了。但是点击任意链接到其他的页面中, flash 就被清空了,所以也就看不到信息了,这正是咱们期待的效果。但是如果用 session 接口,报错信息就会一直显示。

美化一下 css

生成阴影代码,可以使用这个 小工具

最终可以在 common.css.scss 中添加:

.notice {
  position: absolute;
  z-index: 1000;
  bottom: 20px;
  right: 20px;
  background: teal;
  color: white;
  padding: 20px;
  -webkit-box-shadow: 6px 7px 9px -1px rgba(0,0,0,0.68);
  -moz-box-shadow: 6px 7px 9px -1px rgba(0,0,0,0.68);
  box-shadow: 6px 7px 9px -1px rgba(0,0,0,0.68);
}

自动隐藏

下面来实现 flash 信息的自动消失。到 application.html.erb 中 </body> 的上面,添加

<script>
  $('.home-banner').anystretch();
+ var hideNotice = function(){
+     $(".notice").fadeOut("slow");
+ }
+ setTimeout(hideNotice, 4000);
</script>

这样四秒钟后信息就自动消失了。