Rails学习笔记

本文介绍使用Ruby on Rails进行Web开发的过程,涵盖目录结构、数据库搭建、MVC架构解析及其实现方法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建标准目录结构
    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
创建布局
用户反馈和闪存
测试窗体


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值