创建标准目录结构
rails shovell
创建数据库
mysql -u root
CREATE DATABASE shovell_development;
CREATE DATABASE shovell_test;
CREATE DATABASE shovell_production;
MVC体系结构
ActiveRecord是处理事务逻辑和数据库通信的模块。
ActionController是处理模型和视图之间浏览器请求和完成通信的组件。
ActionView是处理客户端呈现页面的组件。
USE shovell_development;
CREATE TABLE Stories (
id int(11) NOT NULL auto_increment,
name varchar(255) default NULL,
link varchar(255) default NULL,
PRIMARY KEY (id)
);
使用Rails控制台:
cd shovell
ruby script/console
保存对象
class Story < ActiveRecord::Base; end
story = Story.new
story.class
story.new_record?
story.save
story.new_record?
story.id
Ruby代码使用嵌入式Ruby(ERb)语法内嵌到HTML语言中。
ERb标签有两种形式:
1. <%=...%>:用于常规输出。
2. <%...%>:用来显示代码。
例子:
<%= 'This line is displayed in the browser' %>
<% 'This line executes silently, without displaying any output' %>
创建视图的实例与创建模型和控制器的实例有所不同。ActionView::Base(所有视图的父类)是Rails中视图的一个基类,视图的实例化由ActionView模块来处理。Rails开发人员需要做的只是修改模板,它是包含视图表示代码的文件,这些模板存储在app/views文件夹中。
Rails对模板文件的命名和存储有很严格的限定:
1、模板与控制器的动作(方法)之间是一对一的映射关系。模板文件的名字与其所映射的动作名相匹配。
2、存储模板的文件夹按控制器命名。
3、模板文件的扩展名取决于模板的类型。
在默认情况下,Rails中有3种类型的模板:
1、rhtml 表示使用ERb标签的标准HTML模板的扩展名。
2、rxml 表示输出XML模板的扩展名(例如,为应用程序生成RSS流)。
3、rjs 表示返回Javascript指示的模板的扩展名。例如,这种类型的模板可用来修改已存在的网页(通过AJAX)以更新<div>标签的内容。
Rails也有特殊模板,如layouts和partials。layouts是控制应用程序全局布局的模板,如保持页之间不变的结构(如基础导航菜单)。partials是一个特殊的子模板,将模板分开成多个独立文件,如下一级菜单或表单,它可以在应用程序中多次使用。
模型、视图和控制器
创建模型
模型生成器
模型生成器是generate脚本驱动的。
generate可以从命令行调用,并匹配一些参数。第一个参数是将创建的组件的类型。
cd shovell
#ruby script/generate model
ruby script/generate model story
使用移植修改模式
使用Rails控制台管理数据
隐藏的SQL语句
打开log文件夹查看日志文件,即可获知Rails为减少用户输入工作而隐藏了大量的SQL语句。
在log文件夹中,保存有以每种环境命名的日志文件。
生成控制器
运行generate脚本
#ruby script/generate controller
ruby script/generate controller Story index
创建视图
有两种方法来为Rails应用程序建立视图。一种是利用支架;另一种是手工创建。
用支架生成视图
支架是用来快速创建与模型数据交互的Web界面接口的工具。
接口列出了表中现有的数据,并提供添加、操作或删除数据的简单方法。
使用支架的方式有两种:
1、临时支架
临时支架是用来辅助,但又不在其上建立应用的一种技术,它只是控制器之外的一行代码。
2、永久支架
它使用generate脚本来生成实时修改的完整工作模板代码。模板代码提供的特性可以以不同的方式组合或执行,而不适合项目的代码可以被删除。
按如下方式编辑位于app/controllers目录下的story_controller.rb文件:
class StoryController < ApplicationController
scaffold:story
end
scaffold:story命令是Rails的一个钩点,为StoryController提供必要的创建、更新以及删除故事功能。
创建静态页面
Actionview 代表模型-视图-控制器中的模型部分,实现快速更新功能,用于生成视图的文件称为模板,通常是在HTML代码中内嵌Ruby代码,这些文件统称为ERb模板。
如下修改app/views/story/index.rhtml文件:
<h1>Story#index</h1>
<p>Find me in app/views/story/index.rhtml</p>
创建动态页面
如下修改app/views/story/index.rhtml文件:
<%= Time.now %>
反复传递数据
如下修改app/controllers/story_controller.rb文件:
class StoryController < ApplicationController
def index
@current_time = Time.now
end
end
如下修改app/views/story/index.rhtml文件:
<%= @current_time %>
引入模型
如下修改app/controllers/story_controller.rb文件:
class StoryController < ApplicationController
def index
@story = Story.find_by_name('SitePoint Forums')
end
end
如下修改app/views/story/index.rhtml文件:
A random link:
<a href="<%= @story.link %>"><%= @story.name %></a>
可以使用link_to功能来取代在HTML中手动输入链接,该方法容易记忆而且有效,如下所示:
<%= link_to @story.name, @story.link %>
实现检索随即故事的应用程序也很简单,只需按如下方式修改控制器中取故事部分的代码:
@story = Story.find(:first, :order => 'RAND()')
助手、窗体和布局
创建窗体
1. form_for助手
使用form_for助手实现窗体与story对象绑定的最基本形式如下:
<% form_for :story do |f| %>
<%= f.text_field :name %>
<%= f.text_field :link %>
<% end %>
2. 创建模板
窗体是一个表示层的概念,意味着它应该像视图一样被存储。
现在创建允许用户提交新的stories给Shovell的窗体,将视图
命名为new,并在app/views/story文件夹中创建一个名为
new.rhtml的模板。该文件包含以下内容:
<% form_for :story do |f| %>
<p>
name:<br />
<%= f.text_field :name %>
</p>
<p>
link:<br />
<%= f.text_field :link %>
</p>
<p>
<%= submit_tag %>
</p>
<% end %>
3. 修改控制器
编辑app/controllers/story_controller.rb文件,创建一个处理窗体动作,其方法如下面代码中加黑的部分所示:
class StoryController < ApplicationController
def index
@story = Story.find(:first, :order => 'RAND()')
end
def new
@story = Story.new
end
end
4. 分析HTML
保存数据到数据库中
我们使用一个单一控制器动作来管理窗体的显示和存储的提交,因此需要找出一种方法来区分两者。
这种方法就是使用HTTP request的方法请求网页。HTTP GET方法用于实现窗体的显示,HTTP POST方法用来实现窗体的提交。当构建的窗体用于提交信息时,将使用POST方法。
要获知用户浏览器是处于取回还是提交信息的过程中,需要查看原始HTTP头部。内置Rails的request对象提供了一种建议方法来判断是否使用POST模式。
任何控制器动作都能调用request对象。它包含用户浏览器发出请求的全部信息,包括HTTP请求方法的类型。判断浏览器请求是否是POST,需要调用request.post?的方法。证实为POST请求,就需要通过窗体将提交的值赋给@story对象。
在类StoryController中,修改new方法,内容如下:
def new
@story = Story.new(params[:story])
if request.post?
@story.save
end
end
params对象是一个包含用户提交的所有内容的散列表。
向散列表传递一个与基础对象同名的符号可以存取数据,例如params[:story]。向散列表传递属性名字,可以引用散列表内的个体元素,例如,name属性值能作为params[:story][:name]存取。
可以让窗体在对象保存之后,立刻将用户重新定向到index动作:
if request.post?
@story.save
redirect_to :action => 'index'
end
创建布局
用户反馈和闪存
测试窗体
rails shovell
创建数据库
mysql -u root
CREATE DATABASE shovell_development;
CREATE DATABASE shovell_test;
CREATE DATABASE shovell_production;
MVC体系结构
ActiveRecord是处理事务逻辑和数据库通信的模块。
ActionController是处理模型和视图之间浏览器请求和完成通信的组件。
ActionView是处理客户端呈现页面的组件。
USE shovell_development;
CREATE TABLE Stories (
id int(11) NOT NULL auto_increment,
name varchar(255) default NULL,
link varchar(255) default NULL,
PRIMARY KEY (id)
);
使用Rails控制台:
cd shovell
ruby script/console
保存对象
class Story < ActiveRecord::Base; end
story = Story.new
story.class
story.new_record?
story.save
story.new_record?
story.id
Ruby代码使用嵌入式Ruby(ERb)语法内嵌到HTML语言中。
ERb标签有两种形式:
1. <%=...%>:用于常规输出。
2. <%...%>:用来显示代码。
例子:
<%= 'This line is displayed in the browser' %>
<% 'This line executes silently, without displaying any output' %>
创建视图的实例与创建模型和控制器的实例有所不同。ActionView::Base(所有视图的父类)是Rails中视图的一个基类,视图的实例化由ActionView模块来处理。Rails开发人员需要做的只是修改模板,它是包含视图表示代码的文件,这些模板存储在app/views文件夹中。
Rails对模板文件的命名和存储有很严格的限定:
1、模板与控制器的动作(方法)之间是一对一的映射关系。模板文件的名字与其所映射的动作名相匹配。
2、存储模板的文件夹按控制器命名。
3、模板文件的扩展名取决于模板的类型。
在默认情况下,Rails中有3种类型的模板:
1、rhtml 表示使用ERb标签的标准HTML模板的扩展名。
2、rxml 表示输出XML模板的扩展名(例如,为应用程序生成RSS流)。
3、rjs 表示返回Javascript指示的模板的扩展名。例如,这种类型的模板可用来修改已存在的网页(通过AJAX)以更新<div>标签的内容。
Rails也有特殊模板,如layouts和partials。layouts是控制应用程序全局布局的模板,如保持页之间不变的结构(如基础导航菜单)。partials是一个特殊的子模板,将模板分开成多个独立文件,如下一级菜单或表单,它可以在应用程序中多次使用。
模型、视图和控制器
创建模型
模型生成器
模型生成器是generate脚本驱动的。
generate可以从命令行调用,并匹配一些参数。第一个参数是将创建的组件的类型。
cd shovell
#ruby script/generate model
ruby script/generate model story
使用移植修改模式
使用Rails控制台管理数据
隐藏的SQL语句
打开log文件夹查看日志文件,即可获知Rails为减少用户输入工作而隐藏了大量的SQL语句。
在log文件夹中,保存有以每种环境命名的日志文件。
生成控制器
运行generate脚本
#ruby script/generate controller
ruby script/generate controller Story index
创建视图
有两种方法来为Rails应用程序建立视图。一种是利用支架;另一种是手工创建。
用支架生成视图
支架是用来快速创建与模型数据交互的Web界面接口的工具。
接口列出了表中现有的数据,并提供添加、操作或删除数据的简单方法。
使用支架的方式有两种:
1、临时支架
临时支架是用来辅助,但又不在其上建立应用的一种技术,它只是控制器之外的一行代码。
2、永久支架
它使用generate脚本来生成实时修改的完整工作模板代码。模板代码提供的特性可以以不同的方式组合或执行,而不适合项目的代码可以被删除。
按如下方式编辑位于app/controllers目录下的story_controller.rb文件:
class StoryController < ApplicationController
scaffold:story
end
scaffold:story命令是Rails的一个钩点,为StoryController提供必要的创建、更新以及删除故事功能。
创建静态页面
Actionview 代表模型-视图-控制器中的模型部分,实现快速更新功能,用于生成视图的文件称为模板,通常是在HTML代码中内嵌Ruby代码,这些文件统称为ERb模板。
如下修改app/views/story/index.rhtml文件:
<h1>Story#index</h1>
<p>Find me in app/views/story/index.rhtml</p>
创建动态页面
如下修改app/views/story/index.rhtml文件:
<%= Time.now %>
反复传递数据
如下修改app/controllers/story_controller.rb文件:
class StoryController < ApplicationController
def index
@current_time = Time.now
end
end
如下修改app/views/story/index.rhtml文件:
<%= @current_time %>
引入模型
如下修改app/controllers/story_controller.rb文件:
class StoryController < ApplicationController
def index
@story = Story.find_by_name('SitePoint Forums')
end
end
如下修改app/views/story/index.rhtml文件:
A random link:
<a href="<%= @story.link %>"><%= @story.name %></a>
可以使用link_to功能来取代在HTML中手动输入链接,该方法容易记忆而且有效,如下所示:
<%= link_to @story.name, @story.link %>
实现检索随即故事的应用程序也很简单,只需按如下方式修改控制器中取故事部分的代码:
@story = Story.find(:first, :order => 'RAND()')
助手、窗体和布局
创建窗体
1. form_for助手
使用form_for助手实现窗体与story对象绑定的最基本形式如下:
<% form_for :story do |f| %>
<%= f.text_field :name %>
<%= f.text_field :link %>
<% end %>
2. 创建模板
窗体是一个表示层的概念,意味着它应该像视图一样被存储。
现在创建允许用户提交新的stories给Shovell的窗体,将视图
命名为new,并在app/views/story文件夹中创建一个名为
new.rhtml的模板。该文件包含以下内容:
<% form_for :story do |f| %>
<p>
name:<br />
<%= f.text_field :name %>
</p>
<p>
link:<br />
<%= f.text_field :link %>
</p>
<p>
<%= submit_tag %>
</p>
<% end %>
3. 修改控制器
编辑app/controllers/story_controller.rb文件,创建一个处理窗体动作,其方法如下面代码中加黑的部分所示:
class StoryController < ApplicationController
def index
@story = Story.find(:first, :order => 'RAND()')
end
def new
@story = Story.new
end
end
4. 分析HTML
保存数据到数据库中
我们使用一个单一控制器动作来管理窗体的显示和存储的提交,因此需要找出一种方法来区分两者。
这种方法就是使用HTTP request的方法请求网页。HTTP GET方法用于实现窗体的显示,HTTP POST方法用来实现窗体的提交。当构建的窗体用于提交信息时,将使用POST方法。
要获知用户浏览器是处于取回还是提交信息的过程中,需要查看原始HTTP头部。内置Rails的request对象提供了一种建议方法来判断是否使用POST模式。
任何控制器动作都能调用request对象。它包含用户浏览器发出请求的全部信息,包括HTTP请求方法的类型。判断浏览器请求是否是POST,需要调用request.post?的方法。证实为POST请求,就需要通过窗体将提交的值赋给@story对象。
在类StoryController中,修改new方法,内容如下:
def new
@story = Story.new(params[:story])
if request.post?
@story.save
end
end
params对象是一个包含用户提交的所有内容的散列表。
向散列表传递一个与基础对象同名的符号可以存取数据,例如params[:story]。向散列表传递属性名字,可以引用散列表内的个体元素,例如,name属性值能作为params[:story][:name]存取。
可以让窗体在对象保存之后,立刻将用户重新定向到index动作:
if request.post?
@story.save
redirect_to :action => 'index'
end
创建布局
用户反馈和闪存
测试窗体