新建一个网络应用
在工作目录,输入:
- 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 s
rails server
rails 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
end
end
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
end
end
然后在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,列举出出当前目录的文件名。