【Ruby on Rails全栈课程】3.3 网站主页面以及相关设置

简介: 每次打开网站,系统会通过root 'home#index'将请求分配到home_controller.rb中的index方法,如果和数据库有数据交互的话,在index方法中调用model模型来实现与数据库的交互,最后将得到的数据显示在app/views/home/index.html.erb页面上。我们再来复习一下网页请求的路径

1、在config/routes.rb文件中,添加代码,指定网站首页的路径


root 'home#index'

每次打开网站,系统会通过root 'home#index'将请求分配到home_controller.rb中的index方法,如果和数据库有数据交互的话,在index方法中调用model模型来实现与数据库的交互,最后将得到的数据显示在app/views/home/index.html.erb页面上。我们再来复习一下网页请求的路径


image.png


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代码下面可能会有版权哦,这个删掉即可


image.png


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<%= %>,这行代码相当于<li><a href="#">登录</a></li>,


因为我们没有定义登录页面,先用#代替登录页面的链接


(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的值。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>


image.png


最后我们重启项目,在浏览器中打开项目,我们看到上面图片效果,说明网站主页面已经成功完成~

目录
相关文章
|
人工智能 IDE 开发工具
JetBrains RubyMine 2025.1 发布 - 最智能的 Ruby 与 Rails IDE
JetBrains RubyMine 2025.1 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE
371 30
JetBrains RubyMine 2025.1 发布 - 最智能的 Ruby 与 Rails IDE
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
574 0
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
292 0
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
202 0
|
调度 Ruby