美文网首页ruby小白课程实战--宠物论坛
【Ruby on Rails实战】3.3 网站主页面以及相关设置

【Ruby on Rails实战】3.3 网站主页面以及相关设置

作者: 808cb3be8e58 | 来源:发表于2018-12-24 17:00 被阅读37次

    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>

      网站主页面

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

    相关文章

      网友评论

        本文标题:【Ruby on Rails实战】3.3 网站主页面以及相关设置

        本文链接:https://www.haomeiwen.com/subject/ibqjkqtx.html