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文件)需要在这里面指定。

目录以及重要文件就是这样了。

  1. 第一个静态页面

上面我们建立了一个hello
的rails应用。在rubymine中运行web,然后在你喜欢的浏览器(这一句是从老外书中学到的,虽然不知道什么意思,但是感觉很厉害的样子)中输入http://localhost:3000,就可以看到rails的缺省界面了。

当然,我们还没有写任何自己的页面。在public目录加入一个index.html,写上你喜欢的任意内容,然后在浏览器里面输入http://localhost:3000/index.html,然后回车,你就看到了静态页面的信息。

  1. 第一个动态页面

这里做个说明,这个动态页面,不是指js动态页面,而是指通过模板替换方式形成的页面。类似asp.net一样的页面。而且还要说明,我们只考虑V,C两个部件,而不考虑M部件。

  1. 进入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是一个道理。

  1. 参数传递

虽然你搞定了经典场景,但是作为一个有理想有抱负的少年,你肯定不会停下你的脚步,怎么都想从页面取点什么东西回来。

这个问题其实也简单。当然,在传数据前,需要一个链接。

我们把页面修改为<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来访问

  1. 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的标签。这些模板类型可以减少一些打字,也提供了一些简便的方法。但是这些东西不是原理性的,这里不提了。

  1. 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,很可能会导致这样的路由问题。记住路由规则就是:越是上面的规则,越先执行。

  1. 错误页面

很不幸,用户可能输入错误网页,而显示的不是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即可

时间: 2024-10-14 09:50:09

rails总结的相关文章

RailsCast26 Hackers Love Mass Assignment rails中按params创建、更新model时存在的安全隐患

Mass assignment是rails中常用的将表单数据存储起来的一种方式.不幸的是,它的简洁性成了黑客攻击的目标.下面将解释为什么及如何解决. 上述表单为一个简单的注册表单.当用户填入name,点击提交时,一个新用户被创建.用户模型被如下定义: ruby create_table :users do |t| t.string :name t.boolean :admin, :default => false, :null => false end 当用户点击提交时,如下的action被执

Rails 5 开发进阶

Rails 5 开发进阶:https://www.gitbook.com/book/kelby/rails-beginner-s-guide/details cancan : http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-1/ Ruby官方文档翻译(Ruby官方文档中文版) : http://blog.csdn.net/liuk10/article/details/509

nginx unicorn 来运行rails

一.安装nginx sudo apt-get install nginx 安装完成后查看一下:nginx -v 说明安装成功. ubuntu系统里的安装目录是在/etc/nginx/下,启动程序文件在/usr/sbin/nginx 二.新建项目 rails new app --skip-bundle 完成后修改Gemfile文件:vim Gemfile 把source 修改成taobao或者ruby-china的源. 在这个文件里加入:gem 'unicorn' 然后运行:bundle inst

rails中是如何实现定时任务的之sidetip

环境:ubuntu14.4,ruby2.1.5, rails4.2 sidetip 依赖于sidekiq,所以在Gemfile里要添加sidekiq. 一.新一个rais项目:rails new schedule_job --skip-bundle 进入项目文件夹: cd schedule_job 打开Gemfile文件:vim Gemfile 把source 'https://rubygems.org'改为source 'https://ruby.taobao.org'. 在文件里加入:gem

rails.vim环境安装(ubuntu)

学习和开发Ruby & Rails已经一年多了.但是正式全职Rails项目的开发只有可怜的4个月经验.这期间我一直使用Netbeans 6.x作为开发工具,到目前为止我依然认为它是开发Ruby & Rails程序的最佳开发工具(我没用过最新出来的RubyMine,另外这是一个付费产品,我也不会付费用它,但也不会用D版). 在网上可以看到很到开发Rails的同学使用Vim这个神器来开发的(就在JaveEye也有不少).但是由于我的vim水平只局限于只会使用有限的几个命令( i, :w, :x

how to change the ruby and rails version

changing ruby version checking ruby version run(if you had have install rvm to manage rubies: $rvm list $rvm use ruby-2.0.0-p643 --defualt changing rails version: changing the rails versions when running rails new to build a new app(installing rails

ruby on rails如何安装

很多朋友在学习ruby语言时,因为才接触,对于ruby基础知识都不知道,比如ruby on rails安装等基础教程,下面就一起来看看安装ruby on rails教程(http://www.maiziedu.com/course/ruby/)吧: 第一,安装ruby,首先从 http://www.ruby-lang.org/zh_CN/downloads/ 下载 Ruby 的Windows 稳定安装版 Ruby 1.8.6 一步安装 (md5: 00540689d1039964bc8d844b

Ubuntu搭建Ruby on Rails环境

安装Ruby 由于Ubuntu的apt包管理器的ruby版本过旧,故考虑从源码编译安装.这里以安装ruby2.3.0为例: sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev cd /tmp wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz tar -xvzf ruby-2.3.0.tar.gz

rails使用bootstrap

在Gemfile文件中添加'bootstrap-sass',再运行bundle install gem 'bootstrap-sass' 在config/application.rb添加一行代码,让bootstrap-sass和asset pipeline兼容 class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. #

整理Ruby相关的各种概念(rvm, gem, bundle, rake, rails等)

转自:http://henter.me/post/ruby-rvm-gem-rake-bundle-rails.html Ruby 这个就不用多说了 RVM 用于帮你安装Ruby环境,帮你管理多个Ruby环境,帮你管理你开发的每个Ruby应用使用机器上哪个Ruby环境.Ruby环境不仅仅是Ruby本身,还包括依赖的第三方Ruby插件.都由RVM管理. Rails 这个也不用多说,著名开发框架.详细看 http://zh.wikipedia.org/wiki/Ruby_on_Rails RubyG