第一个Rails应用

Rails是一个“模型-视图-控制器”框架(MVC)。是用Ruby写的,所以要对Ruby要有一定的了解才能对rails框架深入学习。其实Ruby与Rails就像是python与flask框架,而且ruby和python都是脚本语言,相似处很多。

Rails接受来自浏览器的请求,通过解析请求确定对应的控制器,然后调用控制器中的对应方法,方法可能会到模型中请求数据,然后控制器调用对应视图把结果显示给用户。

跑通第一个rails的demo程序很简单,安装好rails后,执行rails new demo:

查看一下生成的相应文件:

由于在开发环境和生产环境用得数据库可能不一样,开发环境的数据库一般默认为sqlite3.我们可以通过执行rails new demo -skip-active-record,使得不会默认创建database.yml和sqlite3了。我们随后可以通过引入新的gem包去指定我们需要的数据库类型,不过这都是后面才要讲的。

我们先启动rails应用:rails server或者简写为rails s:

在浏览器中访问:localhost:3000,出来的界面如果是下面的,就说明rails应用成功启动了:



从输出的跟踪信息中我们可以看出在3000端口上启动了web服务器,localhost表示Puma Web服务器只接收来自本地设备的请求。

如果想让同一网络中的其他设备也能访问Web服务器,则可以把绑定的主机指定为0.0.0.0:

rails s -b 0.0.0.0

Rails应用的目录结构

先不对默认的rails应用进行修改,之前通过rails new生成了一堆文件,我们可以从这部分分析,即rails的应用目录结构。

app/

app 目录是你主要工作的地方,不同子目录存放了 Models、Controllers、Views、Helpers 和 Assets 等档案。

app/controllers

Controller 存放在这里

app/models

Model 存放在这里

app/views

View 的样本(template)文件,依照不同 Controllers 分子目录存放。

app/helpers

Helper 一些在 Views 中可以使用的小方法,用来产生较复杂的 HTML。默认的 Helper 档案命名是对应 Controller 的,不过并不强制,定义在任一个 Helper 档案中的方法,都可以在任何 Views 中使用。

app/assets

Assets 静态档案存放在这里,包括有JavaScript、Stylesheets样式表和Images图档。详细的用法会在Assets一章中介绍。

config/

虽然 Rails 的原则是惯例优于设定,不过还是有一些需要设定的地方。这个目录下存放了例如数据库设定档 database.yml、路由设定 routes.rb、应用程式设定档 application.rb 和不同执行环境的设定档在 config/environments 目录下。

db/

数据库 Schema(纲要) 和定义档 migrations

lib/

lib目录可以用于存放模型、视图和控制器之外的应用代码,如果你有一些共享的类别或模版文件,可以放在这里,然后用require加载。例如一个放在lib/foobar.rb的类别或模组档案,可以在要使用的.rb档案中这样加载:

require "foobar"

如果放在子目录lib/foo/bar.rb的话:

require "foo/bar"

当然文件不能散乱的放在lib目录中,可以创建子目录来把相关功能整合在一起。在Rails5中需要通过在config/application.rb文件中添加下列代码来加载一下:

config.autoload_path += %W(#{Rails.root}/lib)

一旦加载过后,如果文件中定义了类或模块的小写形式,rails会自动加载文件。比如lib/hello_world墓冢有一个hello.rb文件,只要类的名称是 HelloWorld::Hello,Rails就能自动找到并加载它。

lib/tasks

Rake 任务文件存放在这里,Rake一般是小脚本文件,后面我们会介绍。

log/

不同执行环境的 log 档案会分别记录在这里。日志不仅包含跟踪信息,还包含时序统计、缓存信息和数据库语句的执行时长。也可以通过引入新的log gem包来输出你想要的格式。

public/

这个目录对 Web 服务器来说,就是文件根目录(document root),也就是唯一可以在网络上读取到的目录。

bin/

Rails 的脚本文件,例如执行bin/rake。

test/

单元测试、功能测试及整合测试的文件。如果是不加自己的测试框架,则就将所有的test写在这里;如果用了框架诸如rspec,则会另外生成一个spec的文件夹。

tmp/

. 用来存放暂时用途的文件

vendor/assets

可将第三方的CSS/JavaScript函式库(没有提供Gem安装版本的)复制一份放在这里。

其他根目录下的档案:

config.ru 是用于配置Rack Web服务器接口,在Rails应用中负责创建Rails Metal应用或使用Rake中间件。

Gemfile 设定你的 Rails 会使用哪些 Gems

Gemfile.lock用于记录Rails应用中用到的gem包的具体版本号,由Bundler维护。

README.md 使用手册,用过github的一定很熟悉。

Rakefile 用来加载可以被命令列执行的 Rake 任务

Rails的Hello World

从一个Hello World来写吧。

由于只是输出到浏览器界面上,所以这部分并不需要"模型"的加入,暂时不涉及CRUD部分,所以我们先写控制器和相应的视图就行了。

我们想通过请求http://localhost:3000/say/hello来输出hello world。为什么是这个链接?当然可以不是这个链接,但是这是rails中控制器的最基本路由和请求url之间的关系,放到以后的"路由部分"说。我们现在可以这样理解,不管链接形式是怎样的,如果我们想访问hello world的页面,最后一定会重定向到http://localhost:3000/say/hello这个链接。

这个链接的特殊地方http://localhost:3000/say/hello,事实上在于通过请求先访问say这个控制器,然后访问say控制器中的hello方法。我们通过rails generate controller Say hello生成控制器和相应的hello方法。

rails generate自动帮我们生成了和Say这个控制器相关的视图文件和测试文件和帮助文件,在app/controllers中也生成了相应的say_controller.rb文件:

class SayController < ApplicationController
def hello
end
end

如果我们想增加一个方法直接写也可以,比如我们可以增加一个访问链接http://localhost:3000/say/goodbye,可以直接增加一个goodbye方法:

class SayController < ApplicationController
def hello
end def goodbye
end
end

但是一些视图文件和测试文件需要手动添加了,在config/routes.rb中也需要增加相应的路由选项。这个可以看成是优点也可以看成是缺点。

我们在视图文件app/views/say/hello.html.erb中,其实就是rails中的html文件,写hello,world:

<h1>Hello World!</h1>

然后跑一下程序:rails s,然后访问http://localhost:3000/say/hello:

相应的创建一个goodbye.html.erb然后写入想显示的内容就可以直接通过访问:../say/goodbye看到了。

以上只是静态界面,让我们写一个从控制器传入的字符串的动态界面:

hello.html.erb:

<h1>Hello World!</h1>
<h2> <%= @name %> </h2>
<p> It is <%= @time %> . </p>
<%= "It is #{@time} " %>

在控制器say_controller.rb中加入:

class SayController < ApplicationController
def hello
@name = "yun"
@time = Time.now
end
end

生成的结果如下:

在hello.html.erb中用了两种写法来显示时间,其中<%= .. %>是erb系统处理模版文件中可以嵌入ruby代码,即视图和控制器进行联系的一个语法。

由于web应用通常是一个多页面应用,所以只展示一个页面是不够的。一般来说,应用中的每个页面都对应单独的视图,但是我们可以通过新动作(方法)来处理新页面,同时继续使用原有动作的控制器。正如我们之前增加goodbye方法一样,呢么现在的问题就是如何将两个页面联系起来,我们只需要在hello页面上增加一个指向goodbye页面的链接就行了。Rails按照预定会把url地址解析为目标控制器及动作。通过link_to()方法创建指向goodbye()的链接。调用link_to()方法时,第一个参数是超链接的文本,第二个参数是rails生成的执行goodbye()动作的超链接。

所以可以通过link_to "Goodbye", say_goodbye_path增加跳转到goodbye页面的超链接。这里的say_goodbye_path是指say/goodbye的路径,在路由部分进行详细介绍。所以hello.html.erb文件可以改写为:

<h1>Hello World!</h1>
<h2> <%= @name %> </h2>
<p> It is <%= @time %> . </p>
<%= "It is #{@time} " %>
<%= link_to "Goodbye", say_goodbye_path %>

最后的效果如下:

Rails的信条

Rails信条是一套编程与程序员本身的思想集合,具体的可以参见这一篇文章

Rails应用系列(1):初识Rails的更多相关文章

  1. WCF编程系列(一)初识WCF

    WCF编程系列(一)初识WCF   Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念:  地址:定义服务的 ...

  2. rails Installer之后的调整rails.bat等文件

    rails Installer之后的调整rails.bat文件 出现系统找不到指定路径 学习了:http://www.jianshu.com/p/065355a731ee 修改rails.bat为 @ ...

  3. [Rails学习之路]初识Ruby(一)

    Ruby是一门动态的.强类型的.纯面向对象的编程语言.它和Python非常相似,但比Python面向对象更加彻底.使用更加灵活.语法更加复杂.也更为有趣. 抛开做事情到底应该有多少种方法这个问题,我相 ...

  4. [Rails学习之路]初识Ruby(二)

    继续上次Ruby的学习.接下来就到了Ruby的方法. Ruby的方法与Python仍然很像.使用def定义,可以使用undef取消定义. 在Ruby中,经常可以看见方法后面跟有"?" ...

  5. Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 字符串

    1.辅助方法 2.字符串 输入“irb”进入Ruby命令行开发环境,控制器的启动方法是在命令行中执行“rails console”. (1)字符串连接 >>"foo"+ ...

  6. Ruby on Rails 生成指定版本的 Rails 项目

    ruby-on-rails ruby 本地 Rails 默认5.1.6 版本 $ gem list --local rails (5.1.6, 5.1.5, 5.1.4) 使用 version 生成指 ...

  7. Rails Guide--Working with JavaScript in Rails; 如何把jquery转化为原生js

    1 An Introduction to Ajax 打开网页的的过程也叫:request response cycel. JavaScript也可以request然后parse the respons ...

  8. 安装Ruby On Rails时运行“gem install rails”没有反应怎么办?

    这两天在我的mac机上安装Ruby On Rails,感觉很爽,似乎在使用一个Windows和Linux的结合体,要界面有界面,要命令行有命令行. 不过安装Ruby On Rails的过程中遇到一个问 ...

  9. Gradle系列之初识Gradle

    原文首发于微信公众号:躬行之(jzman-blog) 学习 Android 有一段时间了,开发中经常使用到 Gradle ,但是不知道 Gradle 构建项目的原理,计划花一点时间学习一下 Gradl ...

随机推荐

  1. lazyload is not a function解决方式

    使用jQuery图片延迟加载插件时,可能会报出$("img").lazyload is not a function的错误.(关于如何使用lazyload插件,请看另外一篇文章:j ...

  2. 【FZU2280】Magic

    题意 给出n个字符串,每个字符串有一个权值wi 有q个操作,操作有两种 1 x y 将字符串x的权值变为y 2 x 查询操作,输出以字符串x为后缀,且权值小于等于wx的字符串个数.其中n<=10 ...

  3. OpenCV的Rect矩形类用法

    转自 http://blog.csdn.net/kh1445291129/article/details/51149849 //如果创建一个Rect对象rect(100, 50, 50, 100),那 ...

  4. Anaconda( different versions) configuration in ubuntu 14

    1. 安装自己经常使用的Anaconda版本 sh ./Anaconda3-5.0.1-Linux-x86_64.sh 2. 默认安装到 /home/usr/anaconda3下面,在anaconda ...

  5. g2o:一种图优化的C++框架

    转载自 Taylor Guo g2o: A general framework for graph optimization 原文发表于IEEE InternationalConference on ...

  6. 面试题:测试给定的list,使用for,foreach,iterator删除元素的不同表现

    上代码: 1. 使用增强for循环(foreach) package com.xxx; import java.util.ArrayList; import java.util.List; /** * ...

  7. wgs84坐标系与gcj02坐标系转换误差分布图 | Mapping the Error in Transformation between WGS84 and GCJ02 Coordinations

    国际上通用的是wgs84坐标系,而我国对于境内的坐标进行了加密,采用了gcj02坐标系,或者称为火星坐标系.亢孟军老师带的一门课<多媒体电子地图设计>要求我们从wgs84坐标系转换为gcj ...

  8. 编写高质量代码改善C#程序的157个建议——建议61:避免在finally内撰写无效代码

    建议61:避免在finally内撰写无效代码 在阐述建议之前,需要先提出一个问题:是否存在一种打破try-finally执行顺序的情况,答案是:不存在(除非应用程序本身因为某些很少出现的特殊情况在tr ...

  9. Oracle 定时任务讲解

    前几天,公司的job调度出现了问题,由于权限管的严,没有查看oracle 一些重要的数据字典,后面联系DBA,是由于数据库切换到备机时,参数设置不对,导致db job没有正常调度. 今天刚好有时间,想 ...

  10. C# File类常用方法

    File 类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. 1. File.Exists ——  确定指定的文件是否存在. public static ...