rails总结
rails总结
注意:本文档以rails3.2版本为基础,并且用RubyMine 4.0.3作为ide
一、rails的结构与重要文件
Rails 是一个MVC库。同时,Rails的特点就是:惯用名优先于配置。也就是说,MVC的3个部件,如果你的控制器取名Foo,那么rails认为你的M,V都是Foo。根据这个特性,使用rails,首先需要了解MVC是怎么一个表现形式。Rails采用目录来管理MVC的各个部件。
要想明白rails的目录,首先需要创建一个rails的web程序。
假设我们有一个railsweb目录,运行如下命令:
cd f:/railsweb
rails new hello。
这样,我们就创建了一个rails应用。hello这个目录,就是rails的根目录。进入hello,可以看到rails创建的目录:
qi
其中,app是rails动态网页的主要目录。进入app,可以看到MVC的目录:
asserts:js、css、img文件存放的地方。如果把这些文件放在asserts目录,需要额外编译。
controllers:控制器目录
views:视图目录,根据控制器名称,产生相应名称的目录。这也体现了名字优先于配置。而且这个名字对应是强制的。
models:model的目录
helpers:一些在Views中可以使用的帮助方法。一般来说helper与controller是对应的,但是鉴于helper的特点,这个不强制。
基本上,app就是这样了。
app目录是管理动态网页的,那么静态html呢?返回到hello目录。
我们看到public目录,这个目录就是防止静态html的。rails可以访问public目录,而且把public定义成root。假设public下有一个index.html,如果在rails中访问,就写成www.xxx.com/index.html,或者写成”/”也可以。同时,public下建立的目录,rails也可以访问。一般来说,public下建立js、img、css目录是一个好方法。rails以前的版本就是这样处理。
config目录是存放配置文件的地方。重要的有两个文件:routes.rb与environment.rb。其中routes.rb是用来配置路径的,
environment.rb文件可以配置全局变量。
lib目录是存放一些公共代码的地方。rails在加载时,自动包含了这个目录。可以直接引用这个目录的ruby代码。
hello目录下,Gemfile也是一个重要文件,引用的三方库(gem文件)需要在这里面指定。
目录以及重要文件就是这样了。
第一个静态页面
上面我们建立了一个hello
的rails应用。在rubymine中运行web,然后在你喜欢的浏览器(这一句是从老外书中学到的,虽然不知道什么意思,但是感觉很厉害的样子)中输入http://localhost:3000,就可以看到rails的缺省界面了。
当然,我们还没有写任何自己的页面。在public目录加入一个index.html,写上你喜欢的任意内容,然后在浏览器里面输入http://localhost:3000/index.html,然后回车,你就看到了静态页面的信息。
第一个动态页面
这里做个说明,这个动态页面,不是指js动态页面,而是指通过模板替换方式形成的页面。类似asp.net一样的页面。而且还要说明,我们只考虑V,C两个部件,而不考虑M部件。
进入app\controllers目录,创建一个hello_controller.rb文件。用rubymine打开这个目录,并输入如下代码:
# encoding: utf-8
class HelloController < ApplicationController
def hello
@name = “hello world”
end
end
#encoding:utf-8表示采用utf-8进行编码。必须声明这一句,否则会在运行是出现invalid
multibyte char (US-ASCII)这样的错误。
HelloController,表示一个Hello控制器,这个Controller是必须写的,否则会出错。
控制器有了,那么View呢?
在Views目录下,建立一个hello目录,一定要小写。
然后在hello目录建立一个
hello.html.erb文件。这个文件就是html的模板文件。这个文件中,你只需要写需要的内容,而文件头这些东西都不需要。为什么?看看views目录下的layouts目录,有一个application.html.erb。打开这文件,会看到<%=
yield %>这句。你就知道,你自己写的文件,只是这个yield而已。
在hello.html.erb内,写上
<%= @name
%>,然后你运行http://localhost:3000/hello。你是不是没看到hello这个页面?
这是肯定的!因为你没有给rails说明,这个hello在什么地方,rails只知道这是一个action,就报出一个No
route matches [GET] "/hello"的路由错。
我们打开config目录下的routes.rb文件,在
Hello::Application.routes.draw
do下面添加一句:
get
"/hello" => "hello#hello"
这句话表示,采用get方式,定义一个“/hello”的路径,这个路径来源于
hello控制器类的hello方法。当然,也可以定义路径为
“/aaa”,”/aaa/bbb”,都可以。(路由是一个很大的话题,具体可以参看相关的资料。)
现在再次运行http://localhost:3000/hello,必然能够看到网页上金光闪闪的”hello
world”了。所有,你也就明白了,这个<%=
@name %>表示把@name的值替换成”hello
world”。这一点,与asp.net是一个道理。
参数传递
虽然你搞定了经典场景,但是作为一个有理想有抱负的少年,你肯定不会停下你的脚步,怎么都想从页面取点什么东西回来。
这个问题其实也简单。当然,在传数据前,需要一个链接。
我们把页面修改为<a
href=“/hello?id=12”><%= @name %></a>。
然后,再把hello方法做一个修改,如下:
def hello
n = params[:id]
if (n == '12') then
@name = "hello
hello"
elsif
@name = "hello
world"
end
end
再次刷新页面,点击链接,看看效果是不是出来了?rails自动把id=12这个参数放在params里面。后面这个”:id”,其实就是字符串“id”。使用:id这样的表达式,ruby可以运行快一些。
rails还有一种传递数据的方式,称为REST。简单来说,REST看起来是这样:hello/12,hello/12/1,hello/a/12。这种方式的好坏,可以自行查阅相关文档。
上面这个路径,于是可以改成:/hello/12。当然,我们还是得再一次的修改routes.rb文件,增加一个新的路由方式:
get "/hello/:id" =>
"hello#hello"。
这句话表示,hello有一个参数id,在params内,可以用:id来访问
rails动态页面再次探讨
显然,作为一个程序员,你真心知道,循环是处理相同信息的方式。如果可以自动生成10个新闻标题,你肯定想自动生成。
我们在来看看,怎样动态生成几个div列表。
还是在hello.html.erb内,我们改为:
<a href="/hello?a=12"><%=
@name %></a>
<% @i=0 %>
<% while @i < 10 %>
<div><%= @i
%></div>
<% @i += 1 %>
<% end %>
在运行,是不是一串数字?这下我们看出来,<%
%>内的代码,是ruby的控制结构代码,<%=
%>内的代码(注意,有一个等号)是求值。
这是html与rails混合的例子。当然,也可以用rails定义的一些模板类型来代替html的标签。这些模板类型可以减少一些打字,也提供了一些简便的方法。但是这些东西不是原理性的,这里不提了。
ajax的交互
到了最后ajax了。这个东东不说一下,很容易让人上火。
其实很简单,只需要在hello.html.erb内,先包含js库就可以了。
我们就用jquery吧。
在页面最前面,加上以下两句代码:
<%= stylesheet_link_tag
"/css/er_pub.css" %>
<%= javascript_include_tag
"/script/jquery-1.6.4.js" %>
第一句是包含css,第二句是包含jq。如果你有其他的css或者js,增加几句就可以了。
然后增加一个按钮:
<input type="button"
id="btnTest" value="Test">
再然后写一段ajax代码:
function test() {
$.ajax({
type:"get",
url:'/hello/test',
data:'id=1',
async:false,
success:function
(data) {
if (data == 1) {
alert("ok");
}
else {
alert("false");
}
},
error:function
(XMLHttpRequest, textStatus, errorThrown) {
alert("信息发送失败
: "
+ errorThrown);
}
});
}
$(document).ready(function ()
{
$("#btnTest").bind("click",
test);
});
前台代码搞定了,当然得有后台代码。从ajax调用可以看出,这个调用的action是/hello/test,所以在HelloController.rb中增加一个函数test
def test()
n = params[:id].to_i
if n == 1 then
respond_to do
|format|
format.json {
render :json =>[1] }
end
else
respond_to do
|format|
format.json {
render :json =>[0] }
end
end
end
同样,rails不知道哪里找路径,也需要在路由中增加一条:
get "/hello/test" => "hello#test"
再次刷新页面,看到页面多了一个按钮。猛击这个按钮,是不是出现了一个对话框,里面是一个ok?
当然,很有可能你看到的是个false。既然数据都是对的,为什么会出现错误?答案在路由上面。如果你现在的路由是三条,并且如下顺序:
get "/hello" => "hello#hello"
get "/hello/:id" => "hello#hello"
get "/hello/test" => "hello#test"
很不幸,这样必然失败。因为第二条路由规则适用的是:id,也就是说,这是一个变量的方式,是可以匹配到
/hello/test的。也就是说,id=test,rails就匹配hello这个规则了。现在把/hello/test这个规则放在/hello/:id这个规则之前。再运行,这下成功了吧。好了,一定要记住,一个文件里面多个action,很可能会导致这样的路由问题。记住路由规则就是:越是上面的规则,越先执行。
错误页面
很不幸,用户可能输入错误网页,而显示的不是404页面,而是一个路由失败,你说怎么办?
在路由规则的最后面,增加一条规则(一定要在最后面):
match '*a', :to => 'errors#routing'
增加一个errors_controller.rb的控制器,内容如下:
class ErrorsController < ApplicationController
def routing
render :file =>
"#{Rails.root}/public/404.html", :status => 404, :layout
=> false
end
end
最后,在public目录下,放置一个404.html即可
rails总结的更多相关文章
- Rails sanitize
The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements. T ...
- nginx中error_page没有生效(nginx+passenger+rails)
应用部署方式为 nginx + passenger + rails 当我想要用nginx来默认处理400以上状态时,发现在rails返回respose之后,nginx不会再次执行error_page( ...
- Ruby on Rails 创建https应用
1. 创建证书请求文件条件:私钥+证书签名请求+opensslyum install -y opensslmkdir /root/ssl/ && cd /root/ssl/openss ...
- Rails 5 开发进阶
Rails 5 开发进阶:https://www.gitbook.com/book/kelby/rails-beginner-s-guide/details cancan : http://blo ...
- rails程序文件名命名规范
1 一般文件名是用小写单词加下划线分割,但类的名字用骆驼法.例如 sessions_controller.rb中定义SessionsController. 2 helpers内的文件为辅助类,定义了许 ...
- rails中的form_for
1 form_for方法是ActionView::Helpers::FormHelper模块内的方法,所以可以在ActionView的实例中直接调用 2 from_for方法的原型为form_for( ...
- rails中的session
学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...
- Ubuntu配置Ruby和Rails
安装curl sudo apt-get install curl 安装RVM curl -L https://get.rvm.io | bash -s stable 通过RVM来安装Ruby rvm ...
- rails
http://ruby-toolbox.com/ ~/.gemrc --- :backtrace: false :benchmark: false :bulk_threshold: 1000 :sou ...
- 安装 Ruby, Rails 运行环境 常见的错误
安装部署ruby on rails 的环境时并不是想的那么顺利 这个是我遇到的问题及解决的方式 参考安装博客: (1) https://ruby-china.org/wiki/install_ruby ...
随机推荐
- 加密传输SSL协议4_综合方案
隔了那么多天终于有时间继续把这个专题做完了,这次一定连续写完这方面的笔记. 上篇博文说明了非对称加密和对称加密各自的优缺点,那么就很自然的衍生出了一种综合的方案. 两种方案的结合--扬长避短 首先发送 ...
- javascript限制input只允许输入数字
在做数据提交的表单时,经常要对input输入内容的类型进行限制,譬如javascript限制input只允许输入数字,最好的方法当然是使用javascript,因为它不用与服务器交互,大大减轻了服务器 ...
- python日志记录-logging模块
1.logging模块日志级别 使用logging模块简单示例: >>>import logging >>>logging.debug("this's a ...
- 《转》JAVA中PriorityQueue优先级队列使用方法
该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最 ...
- J2SE知识点摘记(十九)
Collection 1.2.1 常用方法 Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也 ...
- Qt中各个widget前后位置的设定(在Qt中,所有问题都要一分为二,QWidget体系和QGraphicsWidget体系)
这两天在总结一些以往project中遇到的问题,正好别组有同事问我关于Qt中各个widget窗口的前后位置是如何定义的,这里就总结一下: 在Qt中,所有问题都要一分为二,讨论两种不同的情况:一个是最常 ...
- ubuntu 下编译内核
目的: 1. 练习.网上有很多类似的文章可供参考. 2. 为写qemu的watchdog驱动练手. 有朋友问make的 watchdog驱动 需要什么准备,所以写这个blog. 环境: ubuntu ...
- 仅仅需手动添加一行代码就可以让Laravel4执行在SAE (v. 1.0.0)
Github:https://github.com/chariothy/laravel4-sae (已更新至v1.1.0) laravel4-sae (v. 1.0.0) 仅仅需手动添加一行代码就可以 ...
- javascript中算术运算符规则
javascript中提供了几种算术运算符,+(加) -(减) *(乘) /(除) %(余),常规用法与数学上的一致: 但还规定一些特殊规则: 注:JavaScript中保存数值的方式,可以 ...
- ArcMap制图_显示指定区域地图内容
摘要:有一张完整的中国地图,有时仅要求针对某一特定区域制图,那么如何在不进行裁剪的情况下仅显示该区域范围的要素内容? 步骤: 1.打开ArcMap,加载完整的中国地图: 2.将要显示的区域范围制作成一 ...