1、在config/routes.rb文件中,添加代码,指定网站首页的路径
root 'home#index'
每次打开网站,系统会通过root 'home#index'将请求分配到home_controller.rb中的index方法,如果和数据库有数据交互的话,在index方法中调用model模型来实现与数据库的交互,最后将得到的数据显示在app/views/home/index.html.erb页面上。我们再来复习一下网页请求的路径
网页请求路径2、在项目文件夹下运行语句rails g controller home index
其中home是controller的名字,index是controller中实例方法(即action)的名字
/vagrant/data_system$ rails g controller home index
#系统返回信息
create app/controllers/home_controller.rb
route get 'home/index'
invoke erb
create app/views/home
create app/views/home/index.html.erb
invoke test_unit
create test/controllers/home_controller_test.rb
invoke helper
create app/helpers/home_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/home.coffee
invoke scss
create app/assets/stylesheets/home.scss
从系统返回信息中,我们可以看出:
- 创建文件 app/controllers/home_controller.rb,文件里面创建了index方法
- 创建文件 app/views/home/index.html.erb,我们会在里面添加html、js代码
- 创建文件 app/assets/stylesheets/home.scss,我们会在里面添加css样式代码
- 在routes.rb路由文件中添加了语句get 'home/index’,这条语句删掉即可。
index.html.erb文件名的.erb后缀:
erb是Embedded RuBy的简写,意思是「嵌入式的Ruby」。erb允许把一个HTML文件里面加入Ruby代码。插入ruby代码有以下两种形式。
(1)<% ruby代码 %> 结果不需要打印,通常用来声明变量,或者if等判断语句
(2)<%= ruby代码 %> 结果需要打印。home.scss文件名的.scss后缀:
scss是一种语言,可以看成是css的扩展语言,比css更加简洁灵活。即使你是css零基础,也可以直接学习scss。rails是自带scss支持的,将css文件后缀添加上.scss,rails会自动转换。
3、用sublime打开项目文件,在app/assets/stylesheets目录下创建common.css.scss文件
该文件里面放系统通用的样式代码,粘贴下列语句到文件中:
body {
font-family: sans-serif;
margin: 0;
font-size: 14px;
color: #666;
}
.container {
width: 1170px;
margin: 0 auto;
}
*, *:before, *:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
*zoom: 1;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
a {
text-decoration: none;
color: #f5999d;
}
a:hover {
color: #845534;
}
.btn-primary {
color: white;
background: #f5999d;
border-color: #f49bc1;
&:hover {
background-color: #f49bc1;
border-color: #845534;
}
}
.btn {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
line-height: 1.428571429;
text-align: center;
vertical-align: middle;
cursor: pointer;
border: 1px solid transparent;
border-radius: 4px;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
form {
input {
font-size: 21px;
width: 100%;
padding: 10px 12px;
color: #101010;
border: 1px solid #acacac;
outline:none
}
textarea {
height: 210px;
font-size: 21px;
width: 100%;
padding: 10px 12px;
color: #101010;
border: 1px solid #acacac;
outline:none
}
label {
display: inline-block;
margin-bottom: 5px;
color:#f5999d;
}
dd {
margin: 0;
}
.error {
margin: 5px 0 9px 0;
color: #DB8A14;
}
}
.notice {
position: absolute;
background: #f5999d;
right: 50%;
bottom: 50%;
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);
}
td{
text-align: center;
height: 40px;
}
th{
text-align: center;
height: 30px;
}
从简书网站粘贴到sublime代码下面可能会有版权哦,这个删掉即可
删掉即可
4、在app/assets/stylesheets目录中创建layout.css.scss文件,粘贴下面代码
该文件里面放网站头部和尾部样式,其实将下列代码放在common.css.scss文件中也可以,但为了让代码更加规整,我们将网站头部和尾部样式统一放到layout.css.scss文件中。
.navbar {
background: #f49bc1;
position: relative;
height: 60px;
z-index: 1000;
a {
color: #fff;
}
a:hover {
color: #ebebeb;
}
}
.navbar-brand {
float: left;
padding-left: 0;
line-height: 60px;
font-size: 30px;
}
.nav.left {
float: left;
margin-left: 40px;
font-size: 14px;
}
.nav.right {
float: right;
}
.nav li {
float: left;
}
.nav li a {
display: block;
font-size: 1.1em;
padding: 5px 10px;
margin: 15px 10px;
}
.nav li a:hover {
color: #000;
background: #fff;
}
.footer {
border-top: 1px solid #c5c5c5;
min-height: 200px;
margin: 3em 0;
padding-top: 3em;
padding-bottom: 3em;
background: #f8f5f0;
}
.home-banner{
height: 600px;
}
5、在app/assets/stylesheets/home.scss文件中,粘贴下列语句
这个文件是我们在第2步运行rails g controller home index系统自动产生的文件,这里面主要放views/home文件夹下的页面所对应的样式。
.issue-list-header {
border-bottom: 1px solid #ddd;
margin-top: 0;
margin-bottom: 30px;
background: #f5999d;
color: #fff;
.issue-list-heading {
font-size: 2em;
font-weight: normal;
}
}
.align{
font-family: "museo-sans-condensed";
font-size: 20px;
text-align:center;
}
.home-banner-links {
position: absolute;
left: 160px;
top: 280px;
.banner-btn {
padding: 10px 10px;
font-size: 1.2em;
font-weight: 300;
font-family: "museo-sans-condensed";
border-radius: 5px;
color: #fff;
background: rgba(220,20,60,0.2);
border: 1px solid transparent;
&:hover {
border: 1px solid rgba(0,0,0,0.2);
}
}
}
6、app/views/layouts/application.html.erb文件完善
application.html.erb文件是控制页面总体样式的文件,比如在每个页面都需要显示的网站头部和尾部、flash提示、js css文件加载等等,都在此文件定义。
(1)我们先来介绍一下目前application.html.erb文件中代码的含义:
-
开头的<!DOCTYPE html>
说明这是一份HTML5文件,向下相容于所有浏览器的HTML4。 -
<title>DataSystem</title>
代表网站标签显示的名称 -
<%= csrf_meta_tags %>
防止CSRF攻击 -
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
加载app/assets/stylesheets/application.css文件,之后有外来的css文件,我们也在这里加载 -
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
加载app/assets/javascripts/application.js文件,之后有外来的js文件,我们也在这里加载 -
<%= yield %>
代表被加载的views页面,比如我们现在本节创建的home/index.html.erb页面,当要打开网站首页时yield就代表index.html.erb页面
(2)我们将网站标签改为“萌宠之家”
<!--原先代码-->
<title>DataSystem</title>
<!--改为-->
<title>萌宠之家</title>
(3)在网站头部添加登录注册入口,在<%= yield %>上面粘贴以下代码
<div class="navbar clearfix">
<div class="container">
<a class="navbar-brand" href="/">萌宠之家</a>
<ul class="nav right">
<li><%= link_to "登录","#" %></li>
<li><%= link_to "注册","#" %></li>
</ul>
</div>
</div>
<!--参考代码,无需粘贴
<%= yield %>-->
代码解析:
-
<a class="navbar-brand" href="/">萌宠之家</a>
href="/"代表点击「萌宠之家」a标签,页面回到根目录也就是网站主页面 -
<li><%= link_to "登录","#" %></li>
这里应用了嵌入式ruby<%= %>,这行代码相当于<a href="#">登录</a>,因为我们没有定义登录页面,先用#代替登录页面的链接
(4)定义网站尾部以及flash提示,在<%= yield %>代码下面粘贴下列代码
<!--参考代码,无需粘贴
<%= yield %>-->
<% if flash.notice %>
<div class="notice"><%= flash.notice %></div>
<% end %>
<div class="footer">
<div>
<p class="align">©版权所属© 2018</p>
</div>
</div>
<script>
var hideNotice = function(){
$(".notice").fadeOut("slow");
}
setTimeout(hideNotice, 2000);
</script>
代码解析:
-
<% if flash.notice %>
<div class="notice"><%= flash.notice %></div>
<% end %>
如果flash.notice有值,则加载flash.notice的值 -
<div class="footer"></div>
此div标签里面定义了网站尾部的内容 -
<script>
var hideNotice = function(){
$(".notice").fadeOut("slow");
}
setTimeout(hideNotice, 2000);
</script>
在script标签里面包含的是js方法hideNotice,意思是flash.notice提示在展示2秒后消失
7、设置网站主页面图片,并且加载jQuery插件(jquery-anystretch)来保证背景图根据窗口的变化来自动调整大小
jquery-anystretch插件使用说明
https://github.com/danmillar/jquery-anystretch
(1)打开下面链接,将照片命名为index.jpg,并保存到app/assets/images目录中。
https://b-ssl.duitang.com/uploads/item/201510/11/20151011223210_wxjQy.jpeg
(2)我们先来添加jQuery插件jquery-anystretch,在app/assets/javascripts文件夹中新建vendor文件夹,在vendor文件夹下,创建文件jquery.anystretch.min.js,然后再文件中粘贴下面代码。
这个文件应该在「插件使用说明」的链接中下载下来,然后粘贴到项目中。我们现在直接在文件中创建这个文件,并粘贴下面代码(即链接中的代码https://raw.githubusercontent.com/danmillar/jquery-anystretch/master/jquery.anystretch.min.js),效果都是一样的
/*
* jQuery Anystretch
* Version 1.2 (@jbrooksuk / [me.itslimetime.com](http://me.itslimetime.com))
* [https://github.com/jbrooksuk/jquery-anystretch](https://github.com/jbrooksuk/jquery-anystretch)
* Based on Dan Millar's Port
* [https://github.com/danmillar/jquery-anystretch](https://github.com/danmillar/jquery-anystretch)
*
* Add a dynamically-resized background image to the body
* of a page or any other block level element within it
*
* Copyright (c) 2012 Dan Millar (@danmillar / [decode.uk.com](http://decode.uk.com))
* Dual licensed under the MIT and GPL licenses.
*
* This is a fork of jQuery Backstretch (v1.2)
* Copyright (c) 2011 Scott Robbin ([srobbin.com](http://srobbin.com))
*/
(function(a){a.fn.anystretch=function(d,c,e){var b=this.selector.length?false:true;return this.each(function(q){var s={positionX:"center",positionY:"center",speed:0,elPosition:"relative",dataName:"stretch"},h=a(this),g=b?a(".anystretch"):h.children(".anystretch"),l=g.data("settings")||s,m=g.data("settings"),j,f,r,p,v,u;if(c&&typeof c=="object"){a.extend(l,c)}if(c&&typeof c=="function"){e=c}a(document).ready(t);return this;function t(){if(d||h.length>=1){var i;if(!b){h.css({position:l.elPosition,background:"none"})}if(g.length==0){g=a("<div />").attr("class","anystretch").css({left:0,top:0,position:(b?"fixed":"absolute"),overflow:"hidden",zIndex:(b?-999999:-999998),margin:0,padding:0,height:"100%",width:"100%"})}else{g.find("img").addClass("deleteable")}i=a("<img />").css({position:"absolute",display:"none",margin:0,padding:0,border:"none",zIndex:-999999}).bind("load",function(A){var z=a(this),y,x;z.css({width:"auto",height:"auto"});y=this.width||a(A.target).width();x=this.height||a(A.target).height();j=y/x;o(function(){z.fadeIn(l.speed,function(){g.find(".deleteable").remove();if(typeof e=="function"){e()}})})}).appendTo(g);if(h.children(".anystretch").length==0){if(b){a("body").append(g)}else{h.append(g)}}g.data("settings",l);var w="";if(d){w=d}else{if(h.data(l.dataName)){w=h.data(l.dataName)}else{return}}i.attr("src",w);a(window).resize(o)}}function o(i){try{u={left:0,top:0};r=k();p=r/j;if(p>=n()){v=(p-n())/2;if(l.positionY=="center"||l.centeredY){a.extend(u,{top:"-"+v+"px"})}else{if(l.positionY=="bottom"){a.extend(u,{top:"auto",bottom:"0px"})}}}else{p=n();r=p*j;v=(r-k())/2;if(l.positionX=="center"||l.centeredX){a.extend(u,{left:"-"+v+"px"})}else{if(l.positionX=="right"){a.extend(u,{left:"auto",right:"0px"})}}}g.children("img:not(.deleteable)").width(r).height(p).filter("img").css(u)}catch(w){}if(typeof i=="function"){i()}}function k(){return b?h.width():h.innerWidth()}function n(){return b?h.height():h.innerHeight()}})};a.anystretch=function(d,b,e){var c=("onorientationchange" in window)?a(document):a(window);c.anystretch(d,b,e)}})(jQuery);
(3)修改config/initializers/assets.rb文件,指定需要预编译的文件类型,在文件最下面加入下面这行代码
Rails.application.config.assets.precompile += %w(*.css *.js */*.css */*.js *.png *.jpg *.jpeg *.gif */*.png */*.jpg */*.jpeg */*.gif)
代码解析:
- Rails.application.config.assets.precompile += %w(*.css *.js /.css /.js *.png *.jpg *.jpeg *.gif /.png /.jpg /.jpeg /.gif)
表示系统会将项目中所有以.js、.css、.png为后缀的文件进行预编译
预编译:
资源预编译就是系统把要编译的文件(这些文件通过Rails.config.assets.precompile指定),编译好(解释,合并,压缩,打指纹等)形成静态资源,然后把这些静态资源挪到public/assets目录下,以供nginx, apache等web服务器访问。可以提高访问速度,也可以防止浏览器缓存导致显示旧的样式。
具体原理目前不需要深究,我们只需要知道编写ruby项目,需要配置好Rails.config.assets.precompile,系统会自动编译,预编译好的文件,我们就可以在项目中引入了。
(4)根据「插件使用说明」修改app/views/layouts/application.html.erb文件
A、在application.html.erb文件中引入刚刚添加的jquery.anystretch.min.js文件。
#原代码
<%= javascript_include_tag "application", 'data-turbolinks-track': 'reload'%>
#改成
<%= javascript_include_tag "application","vendor/jquery.anystretch.min", 'data-turbolinks-track': 'reload'%>
代码解析:(了解即可)
- <%= javascript_include_tag "application","vendor/jquery.anystretch.min", 'data-turbolinks-track': 'reload'%>
此代码相当于下面代码:
<script src="/assets/application.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/vendor/jquery.anystretch.min.js?body=1" data-turbolinks-track="reload"></script>
预编译复习:
我们上面说到预编译好的文件,我们就可以在项目中引入了。我们刚刚添加的jquery.anystretch.min.js文件在application.html.erb文件中引入。"vendor/jquery.anystretch.min"被编译成了 /jquery.anystretch.min.self-0316f0c78a4cee85193583472bed190a949676dcdfeef7a69334c4f25463c529.js。其中self-0316f0c78a4cee85193583472bed190a949676dcdfeef7a69334c4f25463c529就是编译后的jquery.anystretch.min.js的指纹,它是唯一的,并且会随着jquery.anystretch.min.js内容的改变而改变。
B、 引入两个js文件(根据「插件使用说明」)
<!-- 参考代码,无需粘贴
<%= csrf_meta_tags %> -->
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<!-- 参考代码,无需粘贴
<%= stylesheet_link_tag "application" , media: 'all', 'data-turbolinks-track': 'reload'%> -->
C、在js中使用anystretch方法
//参考代码,无需粘贴
//<script>
$('.home-banner').anystretch();
//参考代码,无需粘贴
// var hideNotice = function(){
8、清空app/views/home/index.html.erb文件,粘贴下面语句
<div class="home-banner" data-stretch="<%= image_url '/assets/index.jpg' %>">
<div class="banner-inner container clearfix">
<div class="home-banner-links">
<%= link_to "发布新帖", "#", class: "banner-btn btn" %>
</div>
<div class="home-banner-links" style="left: 100px;top: 100px;">
<%= link_to "个人中心", "#", class: "banner-btn btn" %>
</div>
<div class="home-banner-links" style="left: 350px;top: 150px;">
<%= link_to "流浪猫救助活动", "#", class: "banner-btn btn" %>
</div>
</div>
</div>
<div class="issue-list-header">
<div class="container clearfix">
<h1 class="issue-list-heading"></h1>
</div>
</div>
代码解析:
-
<div class="home-banner" data-stretch="<%= image_url '/assets/index.jpg' %>">
class="home-banner" 这个div标签class的名字是home-banner,home.scss文件里面写了这个class的对应的样式。上面我们刚刚在application.html.erb文件里面加的js $('.home-banner').anystretch();其中.home-banner指的就是class为home-banner的标签。
data-stretch是结合jquery.anystretch插件使用的,意思是引入文件路径为/assets/index.jpg的图片 -
<%= link_to "发布新帖", "#", class: "banner-btn btn" %>
网站主页面
我们又遇到了嵌入式ruby,这条代码相当于<a href="#" class="banner-btn btn">发布新帖</a>
最后我们重启项目,在浏览器中打开项目,我们看到上面图片效果,说明网站主页面已经成功完成~
网友评论