这次来显示 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>
这样四秒钟后信息就自动消失了。