Rails读书笔记第二章

来源:互联网 发布:苹果手机照片传不到mac 编辑:程序博客网 时间:2024/05/20 06:24

新建一个网络应用

在工作目录,输入:
rails new MyApp
这样Rails就把整个应用的框架搭建起来了。
进入MyApp文件夹,可以看到以下目录结构:
  • app:包含应用的MVC,helper,mailers,assets
  • bin:包含了建立、分布和运行应用的脚本
  • config:包含了route、database等配置文件
  • config.ru:rake的配置文件
  • db:database的schema和migrate
  • Gemfile:应用的gem的dependencies
  • lib:外部module
  • log:应用的log
  • public:呈现给用户的目录,包含静态文件和assets
  • Rakefile:rake的命令
  • test:test文件
  • tmp:临时文件如cache、pid、session等
  • vendor:第三方的gem

使用下面命令可以查看一下这个应用的信息:
rake about
rake是rails提供的一个脚本命令工具,可以执行很多功能。

运行应用

现在在MyApp文件夹下就可以启动服务器:
rails srails serverrails s -b 0.0.0.0
可以通过下面的命令查看server的启动参数:
rails server -h
其中-b是bind,bind到localhost和routable IP address(internet上别人可以访问的地址)。
以下的IP地址是保留地址:
  • class A reserved space 10.0.0.0/8 
  • class B reserved space 172.16.0.0/12 
  • class C reserved space 192.168.0.0/16 
  • class E reserved for research 240.0.0.0 
启动中会显示:
=> Booting WEBrick=> Rails 4.2.4 application starting in development on http://localhost:3000
WEBrick是ruby的web server,打开localhost:3000就是主页。

MVC

作为一个MVC框架,rails从浏览器接收到请求,解析请求并找到一个controller,然后在这个controller中调用一个动作方法(action method)。这个controller就会产生一个view把结果返回给用户。controller和view之间是通过route来定义连接的。

下面我们创建一个名叫Say的controller,包含了hello和goodbye两种动作:
rails generate controller Say hello goodbye
这样就生成了controller,同时也生成了对应的view,并且通过route连接在了一起。此时就可以访问http://localhost:3000/say/hello或者http://localhost:3000/say/goodbye了。
此时如果出现execjs错误,则下载安装node.js。

首先来看controller,代码在app/controllers/say_controller.rb这个文件中:
class SayController < ApplicationController  def hello  end    def goodbye  endend
SayController继承自ApplicationController,包含了hello和goodbye这两个方法。

再来看view,代码在app/views/say下,其中hello.html.erb文件就对应了http://localhost:3000/say/hello这个url,而goodbye.html.erb文件对应了http://localhost:3000/say/goodbye这个url。
例如hello.html.erb文件内容如下:
<h1>Hello from Rails! </h1>

此时在routes.rb文件中有如下内容:
Rails.application.routes.draw do  get 'say/hello'  get 'say/goodbye'
即捕获了say/hello和say/goodbye动作。
从上面可以看出,Rails使用文件名来匹配这些动作,在SayController定义了hello和goodbye动作,在view里生成了hello和goodbye的网页,而在routes里捕获了hello和goodbye的动作。

ERB

erb文件将ruby代码嵌入到了文本中,并通过ERB系统将ruby代码执行并转换。<% ruby代码 %> , <%= ruby返回结果%>。
例如hello.html.erb是将ruby代码嵌入到了html文件中:
<h1>Hello from Rails! </h1><p>    It is now <%= Time.now %></p>
这样<%= Time.now %>就会返回一个时间的string。
不过通常view是通过controller来控制的,把time作为一个参数从controller传到view来。
因此在say_controller.rb中添加一个成员变量time:
class SayController < ApplicationController  def hello    @time = Time.now  end  def goodbye  endend
然后在hello.html.erb中使用这个time变量:
<h1>Hello from Rails! </h1><p>    It is now <%= @time %></p>
在rails框架中,view可以直接使用controller的变量。

link_to

为了实现在hello页面和goodbye页面之前切换,可以直接分别加入hyperlinke:
在hello.html.erb中:
<p>Say <a href="/say/goodbye">Goodbye</a>!</p>
在goodbye.html.erb中:
<p>Say <a href="/say/hello">Hello</a>!</p>
但这种直接引用的方法并不是一个好方法,最好是使用Rails的template helper的方法来创建一个指向动作的hyperlink。
在hello.html.erb中:
<h1>Hello from Rails! </h1><p>    It is now <%= @time %></p><p>    Time to say <%= link_to "Goodbye", say_goodbye_path %>!</p>
这里使用了link_to方法,链接显示的文字是Goodbye,而say_goodbye_path是Rails提供的指向goodbye动作的URL(say_goodbye_path等价于/say/goodbye的路径)。由此就创建了一个动作链接。

添加一个方法

我们在创建SayController时定义了hello和goodbye两个动作,现在我们想添加一个动作叫filenames来显示当前文件夹下的文件。
首先我们在say_controller.rb中添加filenames这个方法:
class SayController < ApplicationController  def hello    @time = Time.now  end  def goodbye  end    def filenames      @files = Dir.glob('*')      return @files  end  end
这里新建了一个files的成员变量来存储文件。
然后在app/views/say下新建filenames.html.erb这个view文件:
<h1>Files in the current directory</h1><p>    The files in the current directory are: </p><ul>        <% for file in @files %>    <li><%= file; %></li>    <% end %></ul>
最后在routes.rb中将这个方法和view链接起来:
Rails.application.routes.draw do  get 'say/hello'  get 'say/goodbye'  get 'say/filenames'
重启server后,就可以访问http://localhost:3000/say/filenames,列举出出当前目录的文件名。





0 0
原创粉丝点击