日星网 windows 中文论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 930|回复: 16

Rails基础知识

[复制链接]
发表于 2016-3-16 03:46:58 | 显示全部楼层 |阅读模式


Rails框架首次提出是在2004年7月,它的研发者是26岁的丹麦人David Heinemeier Hansson。不同于已有复杂的Web 开发框架,Rails是一个更符合实际需要而且更高效的Web开发框架。Rails结合了PHP体系的优点(快速开发)和Java体系的优点(程序规整),因此,Rails在其提出后不长的时间里就受到了业内广泛的关注。(来自百度百科)

简介
Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架。Rails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,Rails 为你提供一个纯Ruby的开发环境。发布网站时,你只需要一个数据库和一个网络服务器即可。
Ruby On Rails是一个用于编写网络应用程序的软件包.它基于一种计算机软件语言Ruby,给程序开发人员提供了强大的框架支持.你可以用比以前少的多的代码和 短的多的时间编写出一流的网络软件。
Ruby On Rails的指导原则是”不要重复你自己”(Don’t Repeat Yourself, 或DRY).意思是说你写的代码不会有重复的地方.比如以往数据库的接口往往是类似的程序代码但是在很多地方都要重复用到.这无论是给编写还是维护都造成 了很大的代价.相反,Ruby On Rails给你提供了绝大多数的支持,让你只需要短短的几行代码就可以实现强大的功能.而且,Rails提供了代码生成工具,让你甚至不需要编写一行代码 就实现强大的管理程序.
Ruby On Rails通过reflection和runtime extension减少了对configuration文件的依靠,这和Java,C#语言的方向有很大不同,让你减少了很多配置和部署的麻烦,但是性能上却完全可以应付一般网站的需求.
Rails 支持各类网络服务器和数据库。在服务器方面,我们推荐Apache、 lighttpd 或 nginx 代理至 Mongrel (或者使用FastCGI)。数据库方面,你可以采用MySQL、PostgreSQL、SQLite、Oracle、SQL Server、DB2、 或其他任何我们支持的系统。 Rails可以在各类操作系统上运行,不过我们建议采用基于unix的系统进行开发。
 楼主| 发表于 2016-3-16 03:49:24 | 显示全部楼层
Rails 请求处理流程

首先我们了解一下 Rails路径控制
config/routes.rb 在这个文件中,我们可以编辑路径及访问的关系。

Ruby执行动作(Action), 动作通过Model 进行数据的读取及写入, Model对数据库进行操作。

通路追加
线上例子,我们要在自己的base程序上添加一个about页面

在routes.rb end前追加
  1.   root "top#index"
  2.   get "about" => "top#about", as: "about"
复制代码


然后我们要在TopController中追加 about动作(方法)
  1. class TopController < ApplicationController
  2.         def Index
  3.                 @message = "你好,世界"
  4.         end
  5.        
  6.         def about
  7.         end
  8. end
复制代码


为了能够显示页面,我们还需要在app/views/top文件夹下创建about.html.erb
  1. <% @page_title = "关于" %>
  2. <h1><%= @page_title %></h1>

  3. <p>Morning Glory球队、在1999年结成的草根棒球球队、因为每周的星期六很早就来练习、所以球队的名称就叫做Morning Glory。</p>
复制代码


记得保存为utf-8格式,否则容易出错。


通路详解
首先介绍上面代码中提到的root方法

root 控制器名#动作名
  1. root "main#index"
复制代码


特定的路径对应的动作 使用 get方法
get "路径" => "控制器名#动作名"
post "路径" => "控制器名#动作名"

"info/proo" => "info#proo" 的时候可以省略成为
  1. get "info/proo"
复制代码


as:  在通路使用as 可以设定相应名称的路径 ,在控制器及view中还可以使用 help_path方法可以返回 "/相应路径名"
  1. get "help" => "documents#help", as: "help"
复制代码


可以添加参数
  1. get "articles/:year/:month" => "articles#show"
复制代码
 楼主| 发表于 2016-3-17 04:33:13 | 显示全部楼层
Rails 控制器和动作
Rails程序,基于MVC而开发的,我们按照 C → V → M的顺序进行学习

■控制器基础
控制器的记述方式
所有的控制器都是作为ApplicationController的子类进行调用

  1. class TopController < ApplicationController
  2. def index #index 动作
  3. #view index.html.erb
  4. end
  5. def about #about动作
  6. #view about.html.erb
  7. end
  8. private #私有方法
  9. def prepare
  10. end
  11. end
复制代码
■命名规则
控制器命名规则
名称用例规则
控制器类名MemberControler○○Controller, 首字母大写
控制器文件名member_controler.rb○○_controler.rb
模板文件夹app/views/membersapp/views/○○

模式命名规则
名称用例规则
数据表名members首字母小写,复数形式
model类名Member首字母大写
model文件名member.rb○○.rb
数据表明为双单词组合时,shopping_carts 中间使用下划线连接 控制器类名为ShoppingCartsContorller, model类名为ShoppingCart
动作
我们先创建一个实例
  1. rails new app
  2. rails g controller lesson #创建一个lesson的控制器
复制代码

小知识点
  1. rails g controller lesson edit update
复制代码

会同时创建相应的edit update模板页面
这时,你到app/controllers 下会发现新的控制器 lesson_controller.rb

■参数取得 通过动作可以获得参数,有两种方法
1. http://127.0.0.1:3000/lesson/step1/参数
2. http://127.0.0.1:3000/lesson/step1?name=参数

打开刚才生成的lesson_controller.rb
  1. class LessonController < ApplicationController
  2. def step1
  3. render text: "你好,#{params[:name]} 先生"
  4. end
  5. end
复制代码
启动程序
在地址栏中输入 http://127.0.0.1:3000/lesson/step1?name=winbughttp://127.0.0.1:3000/lesson/step1/winbug), 就会看到结果了。

params[:name] 也可以使用 param["name"]代替
params还可以返回控制器名及动作名
  1. class LessonController < ApplicationController
  2. def step1
  3. render text: "你好,#{params[:name]} 先生"
  4. end
  5. def step2
  6. render text: "控制器:#{params[:controller]}, 动作:#{params[:action]}"
  7. end
  8. end
复制代码

重定向 Rails 使用 redirect_to 方法,能够非常容易的进行重定向。
  1. def step3
  2. redirect_to action: "step4"
  3. end
  4. def step4
  5. render text: "现在已经从step3重定向过来了。"
  6. end
复制代码
重定向的状态有几种,请参考
301 永久移动
302 暂时性转移
303 其他,与301,302不同的地方,Location头制定的重定向目标文档通过GET获得
307 临时

Flash
Rails 的 Flash 可以帮助程序在动作与动作之间传递值
  1. def step5
  2. flash[:notice] = "向step6移动"
  3. redirect_to action: "step6"
  4. end
  5. def step6
  6. render text: flash[:notice]
  7. end
复制代码

■回调
程序运行前后,按照指定方法进行处理的方法
回调有三种方法
before_action, after_action, around_action

before_action运行有以下几部
1. 不能与动作名重名
2. 在私有方法中创建回调名相同的方法
3. 在控制器中,简单指定回调

  1. before_action :set_message, only: :step7
  2. def step7
  3. render text: @message
  4. end
  5. private
  6. def set_message
  7. @message = "你好, 世界"
  8. end
复制代码

option only: 指定能够执行的动作,复数时, only:[:step7, :step8, :step9]
option except: 指定外的动作可以执行, except: :step7
 楼主| 发表于 2016-3-17 09:11:53 | 显示全部楼层
Rails 模板
模板文件一般都是 erb文件

模板的记述方式
Rails的模板(erb文件),在HTML中填入Ruby的代码,<%  %>或<%=  %>中间的部分,Ruby可以进行解读

  1. <p><% price = (2000 * 1.15).floor %></p>
  2. <p><%= price %>元</p>
  3. <p><%= @price %>元</p>
复制代码


■render 方法
动作可以共享同一个模板文件

  1.         def step9
  2.                 @price = (1000 * 1.15).floor
  3.                 render "step8"
  4.         end
复制代码

这种情况,即使控制器中没有step8的动作,只要有step8.html.erb模板文件就可以执行。

HTML特殊文字转换
为了防止恶意入侵,有时需将HTML转换成特殊代码

  1. def step10
  2.                 @comment = "<script>alert('这是危险代码')</script>"
  3.         end
  4.        
  5.         def step11
  6.                 @comment = "<strong>安全代码</strong>"
  7.         end
复制代码


在模板端如果直接使用 <%=  %> @comment中的符号 将转换为特殊代码
<%== %>将直接输出。

■helper方法制作
一般模板使用的方法可以在helper中添加,并且,在app/helpers文件夹下定义的help模块,在整个模板文件中都会被调用
helper模块文件的制作方法, 文件○○_helper.rb 模块 ○○Helper, helper模块和控制器没有特别的关系,所以不要把相同的方法重复在两个 地方使用。

■链接
Rails的链接可以使用 link_to来制作
link_to的第一个参数 是表示文字
link_to的第二个参数 是链接地址也可以是各种Rails 通路方法
link_to的第三个参数 功能追加 HTML属性追加

  1. <p><%== @comment %></p>
  2. <p><%= link_to "home", "http://www.ttwinbug.com", target: "_blank", data: {confirm: "真的跳转么?"} %></p>
  3. <p><%= link_to_unless_current "This Page", "step11" %></p>
复制代码


link_to_unless_current 如果是当前页的话,不添加链接

■图片
Rails中的图片也可以使用方法生成
  1. <%= image_tag("20150113111514271.jpg", size: "640x3442", alt: "Ruby on Rails", align: "top") %>
复制代码


其中image_tag第一个参数 图片的文件名
第二个参数 属性, size

link_to及image_tag的组合
  1. <%= link_to(image_tag("rails.png", size: "87x111"), "http://www.ttwinbug.com") %>
复制代码


■条件判断
记述方式 <% if 条件 %> ~ <% else %> ~ <% end %>

  1. <% if @kucun > 0 %>
  2. <p>库存还剩下 <%= @kucun %></p>
  3. <% else %>
  4. <p>没有库存了</p>
  5. <% end %>
复制代码


■循环
  1. <% @kucun.times do %>
  2. 库存啊
  3. <% end %>
复制代码
 楼主| 发表于 2016-3-21 02:21:13 | 显示全部楼层
Rails 实体模块

■layout模板
layout模板放置在程序下的 app/views/layouts文件夹下, 我们制作一个程序后, 在其app/views/layouts文件夹下,都会发现一个application.html.erb的文件,这个就是默认的layout模板文件。打开文件后,其中的<%= yield %> 其实就是调用各个动作的地方。

现在我们可以对默认的模板进行一下小小的修改
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.         <meta charset="utf-8" />  <!-- 追加了一个meta -->
  5.         <title><%= page_title %></title>                <!-- 自定义了title  -->
  6.         <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
  7.         <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  8.         <%= csrf_meta_tags %>
  9. </head>
  10. <body>

  11. <%= yield %>

  12. </body>
  13. </html>
复制代码


由于title部分被修改,所以我们还要将title添加一个方法在 app/helpers/application_helper.rb
  1. module ApplicationHelper
  2.         def page_title
  3.                 title = "Morning Glory"
  4.                 title = @page_title + " - " + title if @page_title
  5.                 title
  6.         end
  7. end
复制代码


layout模板的切换

总共有三种方法
1) 在app/views/layouts文件夹下创建  top.html.erb的文件,这样就和控制器 TopController连接上了。
2) 在控制器中使用 layout 方法
  1. layout "simple"
复制代码

3) 在动作内,使用 render方法
  1. render layout: "error"
复制代码


局部模板
使用方法: 在文件名前添加 _ 位置和模板文件一样
如果添加在其他模板文件中时
使用 <%= render "模板名" %>

例子用文件app1.zip

样式
Rails的样式一般放在 app/assets/stylesheets文件夹下
application.css文件中
头几行的 *= 为必要部分
 楼主| 发表于 2016-3-21 06:34:57 | 显示全部楼层
Rails 数据库和模型[M]

Rails 数据库的设定
1. DBMS连接
2. 生成数据库
3. 生成数据库表
4. 生成数据

■DBMS连接
Rails 对数据库的连接设定,在 config\database.yml中,一般不需要修改

■3种模式
1. development:  开发模式
2. test:        自动测试模式
3. production:        公开模式

设定方法
  1. export RAILS_ENV=production  #MAC
  2. set RAILS_ENV-production  #windows
复制代码


■生成数据库
  1. rake db:create RAILS_ENV=production
复制代码

这样就可以在db文件夹内生成一个正式数据库

数据库删除
  1. rake db:drop
复制代码


Time Zone设定
设定时间区域的话,在 config\application.rb
config.time_zone
  1. config.time_zone = 'Beijing'
复制代码




■Rake
Rake 是 Rails的非常简单便利的bulid 工具,查看他能够做什么的命令是
  1. rake -T
复制代码

 楼主| 发表于 2016-3-21 08:35:04 | 显示全部楼层
生成数据表

对应数据库,我们还要制作相应的模型
生成模型的命令
  1. rails g model member
复制代码


规格
Rails的规格功能可以帮助我们,在开发过程中,对数据库的表进行追加修改等操作。
db/migrate 文件夹下 有20160321075124_create_members.rb 相似的文件被叫做规格脚本

在这里面,我们可以添加新的列

  1. create_table :members do |t|
  2.         t.string :name
  3.       t.timestamps null: false
  4.     end
复制代码



创建members表
我们要创建的表里含有用户名,全名等资料,我们可以继续在 上述的xxx_create_members.rb中添加需要的数据表
  1. class CreateMembers < ActiveRecord::Migration
  2.   def change
  3.     create_table :members do |t|
  4.             t.integer :number, null: false                                                        #号码
  5.         t.string :name                                                                                 #姓名
  6.         t.string :full_name                                                                        #全名
  7.         t.string :email                                                                                #邮箱
  8.         t.date :birthday                                                                                #生日
  9.         t.integer :gender, null: false, defalut: 0                                #性别(0:男, 1:女)
  10.         t.boolean :adminstrator, null: false, default: false                #管理flag
  11.       t.timestamps null: false
  12.     end
  13.   end
  14. end
复制代码


null: false 代表着不允许空值

然后我们在命令行执行
  1. rake db:migrate RAILS_ENV=production
复制代码


这样我们就将现有的数据库更新,并创建了members表
我们通过工具打开表,发现里面有created_at 和 update_at 两列,这两列分别代表了,创建时间和更新时间

列的追加
  1. rails g migration 类名
复制代码
在db/migrate文件夹下会生成新的规格文件
打开文件并修改
  1. class ModifyMembers < ActiveRecord::Migration
  2.   def change
  3.             add_column :members, :phone, :string
  4.   end
  5. end
复制代码


add_column方法, 第一个参数为表名, 第二个参数为追加的列名, 第三个参数为新追加列的类型

规格版本
一般规格文件版本都按照时间顺序来表示, 如果想恢复到以前的规格,使用一下命令
  1. rake db:migrate VERSION=时间版本号
复制代码


想查看有多少个版本的话
  1. rake db:migrate:status
复制代码


只想恢复到前一个版本的话
  1. rake db:rollback STEP=3
复制代码
STEP=3为执行3次

列的删除和变更
add_column(表名, 列名, 型, 设置)        列的追加
rename_column(表名, 列名,新名称)        列的名称变更
change_column(表名, 列名, 型, 设置)        列的类型变更
remove_column(表名, 列名)        列的删除  

索引
添加索引可以提高查找速度
  1. add_index :member, :name, unique: true, name: 'name_index'
复制代码

unique(禁止重复)  name(指定索引名)
 楼主| 发表于 2016-3-22 02:28:55 | 显示全部楼层
保存数据

■Rails 控制台
  1. rails c        #development
  2. rails c -e production        #正式
复制代码


■追加数据
实例做成的时候需要使用 save方法

  1. member = Member.new
  2. member.number = 1
  3. member.name = "Taro"
  4. member.save
复制代码


或者是
  1. member = Member.new(number:1, name = "Taro")
  2. member.save
复制代码


或者是
  1. member = Member.new
  2. member.assign_attributes(number: 1, name: "Taro")
  3. member.save
复制代码


SEED数据
开发时使用的测试用数据成为SEED数据

Rails的SEED数据一般存放在db文件夹下的seed.rb中

  1. table_names = %w(members)
  2. table_names.each do |table_name|
  3.   path = Rails.root.join("db/seeds", Rails.env, table_name + ".rb")
  4.   if File.exist?(path)
  5.     puts "Creating #{table_name}..."
  6.     require path
  7.   end
  8. end
复制代码


path,指定seed文件位置,意思是在db/seeds/ Railsn.env 文件夹下的 table.rb 文件

在写入数据前,一般都会执行一次
  1. rake db:reset   #清除数据库内容
  2. rake db:seed  #读取数据SEED文件
复制代码


这样SEED文件就导入完毕了。

 楼主| 发表于 2016-3-22 06:22:04 | 显示全部楼层
记录的读取及搜索

find 和 find_by
■find
启动控制台

  1. Member.ids        #显示所有id
  2. member = Member.find(3)  #读取id = 3的数据
复制代码


■find_by
启动控制台

  1. member = Member.find_by(name: "Taro")
复制代码


find和find_by的区别
使用find,前提是允许发生错误,出现错误时,有提示出现
如果不希望出现提示的情况下,一般使用find_by

搜索方法及对象关系

搜索方法里面最经常使用的就是 where
打开控制台
  1. member = Member.where(name: "Jiro")
复制代码


 楼主| 发表于 2016-3-22 07:50:39 | 显示全部楼层
REST和路由
REST (Representational State Transfer)

■REST 和 资源
Rails的资源设定在 config目录下的 routes.rb文件中。
我们在前几章涉及的资源可以写在其中

  1. resources :members
复制代码

这样设置后,MembersController将会可以设定相应的7个动作。

资源和控制器

所谓的7个动作就是与数据库操作相关的动作
index 资源一览(所有表内的记录查看)
new 资源追加(表内追加新的记录)用Form
create 资源追加(表内追加新的记录)
show 资源属性(显示记录内容)
edit 资源更新(更新存在的记录)用Form
update 资源更新(更新存在的记录)
destroy 资源删除

路径与HTTP方法
动作路径HTTP方法
index/membersGET
show/members/123GET
new/members/newGET
edit/members/123/editGET
create/membersPOST
update/members/123PATCH
destroy/members/123DELETE


资源与路径指定
资源路由设定后,link_toredirect_to方法可以简单的指定路径了

■返回路径的方法
resources方法指定资源后, 控制器的表示动作路径可以通过 资源名_path的形式取得
已resources :members为例,下面的方法可以使用

动作返回路径方法返回值
indexmembers_path/members
showmember_path(member)/members/123
newnew_member_path/members/new
editedit_member_path(member)/members/123/edit
createmembers_path/members
updatemember_path(member)/members/123
destroymember_path(member)/members/123


按照上面的表,我们可以制作模板
  1. link_to "会员列表", members_path
  2. link_to @member.name, member_path(@member) #会员详情页面
  3. link_to "删除", member_path(@member), method: :delete #删除用户
复制代码


资源名_url方法
返回从http开始的全部地址

设置
  1. link_to "修改", [:edit, @member] #表示/members/123/edit
  2. link_to "停止", [:suspend, #member], method: :patch #表示/members/123/suspend
复制代码

[:动作名, 设置]可以这样设置路径
 楼主| 发表于 2016-3-23 02:39:02 | 显示全部楼层
7个动作的应用
制作MembersController

present?方法 和 blank?方法
在Rails程序中,所有的对象都可以调用 present?blank? 方法
来测试用户输入的数据或是记录是否为空

如果对象为 nil, false, 空字段, 空白文字(换行及tab), 空的数组,空的哈希 blank? 返回true
present? 返回false

其他模板代码
form_tag 生成一个Form, 参数action,及method指定
text_field_tag 生成一个input text型,第一个参数为name值, 第二个参数为value属性值
submit_tag 生成一个submit按钮,
try方法 防止错误发生的用法 @member.birthday.try(strftime, ""), 防止birthday为空的时候,弹出报错
方法 判断属性是true还是false
form_for方法 可以生成一个带有安全key的Form  form_for @member, url: member_path(@member), method: :path
password_field方法 生成一个input password型
  1. <%= form.password_field :password, size: 12  %>
复制代码

hidden_field方法 生成一个input hidden型
  1. <%= form.hidden_field :some_value  %>
复制代码

text_area方法 生成一个textarea型
  1. <%= form.text_area :remarks, color: 40, rows: 3  %>
复制代码

check_box方法 生成一个checkbox型
  1. <%= form.check_box :administrator, {}, "on", "off"  %>
复制代码

radio_button方法 生成一个radio型
  1. <%= form.radio_button :gender, 0 %>男
复制代码

select方法 生成一个select型
  1. <% options = ["北京", "天津", "上海", "广州"] %><%= form.select :area, options %>
复制代码

date_select方法 生成一个日期选择工具
  1. <%= form.date_select :birthday, start_year: 1940, end_year: Time.now.year, use_month_numbers: true %>
复制代码

file_field方法 生成一个上传用组件
  1. <%= form.file_field :uploaded_file %>
复制代码

button方法 生成一个按钮
  1. <%= form.button "click me", type: "button"
复制代码

label方法 生成一个label
  1. <%= form.label :name, "姓名" %>
复制代码

truncate方法 截取指定范围的字符串
  1. <%= truncate(article.body, length: 80) %>
复制代码

kind_of?方法 调查所使用的控制器种类
  1. <% if controller.kind_of?(MembersController) #返回控制器的种类,如果是Members就执行%>
复制代码

  1. <%= render "form", form: form %>
复制代码

读取局部模板form, 并向本地传递form的变量

  1. <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  2.   <%= csrf_meta_tags %>
复制代码

模板中,以上两行非常重要,第一行为读取Rails的javascript文件
第二行 csrf_meta_tags  为了防止CSRF,所进行的安全处理

■为网页添加分页
修改Gemfile
  1. gem 'will_paginate',
复制代码


为左右键添加中文
打开 zh-CN.yml
  1. will_paginate:
  2.     previous_label: "前一页"
  3.     next_label: "后一页"
复制代码

在相应的控制器中添加方法
  1.   def index
  2.     @articles = Article.readable_for(current_member).order(released_at: :desc)
  3.       .paginate(page: params[:page], per_page: 5)
  4.   end
复制代码

并在模板文件中,追加代码
  1. <%= will_paginate @articles %>
复制代码


即可实现


制作例下载

 楼主| 发表于 2016-3-23 04:20:13 | 显示全部楼层
Rails 程序正式发布中遇到的各种问题

一般Rails 的程序都属于devolopment模式, 如果我们想正式开发及看效果的话,需要使用一下命令
  1. rails s -e production -p 80 -b 0.0.0.0
复制代码


但是一般这样执行后,会出现
Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml` 错误

我们这时候要执行
  1. rake secret
复制代码

将生成出来的随机密码
  1. export SECRET_KEY_BASE=密码
复制代码

才能够正常的开启程序

接着痛苦的是,样式及js全部消失
解决办法
  1. $ RAILS_ENV=production bundle exec rake assets:precompile
复制代码


并到程序下的 config\environments\production.rb 中添加
  1.   config.serve_static_assets = true
复制代码







关于开发时,关闭strong parameter功能
我们打开 config\application.rb

添加
  1.     #strong parameters close, 之后必须关闭此选项《安全相关》
  2.     config.action_controller.permit_all_parameters = true
复制代码

正如提示的那样,这个功能和安全相关,开发完成后,请关闭此选项


*********************************************************************************************************
篇外 strong parameter

正式发布之前一定要把这个功能打开。这样可以防范很多简单攻击

config/application.rb 中设置以下代码
  1. config.action_controller.permit_all_parameters = false
复制代码


strong parameter 使用方法

在相应的controller中添加以下方法
  1. private
  2.   def article_params
  3.     params.require(:article).permit(:title, :body, :released_at, :expired_at, :member_only)
  4.   end
复制代码


permit方法  对发给model的对象属性进行限制,以防止其他危险信息的操作
上面代码的意思是,只允许提交 title, body, released_at, expired_at, member_only这些数据。其他数据禁止。
 楼主| 发表于 2016-3-25 02:38:30 | 显示全部楼层
认证

app/models/member.rb
validates方法 判断模型属性是否符合标准
  1. validates :number, :name, presence: true
  2. validates :name, length: {maximum: 20}
复制代码


validate方法 使用这个方法可以指定认证方法
  1. validate :check_email
  2.        
  3.         private
  4.         def check_email
  5.                 if email.present?
  6.                         errors.add(:email, :invalid) unless well_formed_as_email_address(email)
  7.                 end
  8.         end
复制代码


app文件夹下,我们可以自定义新的子目录, 比如 lib, works等, 系统都会自动配置

新添加的方法,可以使用include引入,命名方式 email_address_checker.rb  => EmailAddressChecker

■错误提示

  1. <% obj.errors.full_messages.each do |msg| %>
  2.     <li><%= msg %></li>
  3. <% end %>
复制代码
 楼主| 发表于 2016-3-25 06:45:49 | 显示全部楼层
Rails 国际化

修改方法:
config/application.rb 中修改 #config.i18n.default_locale = :de

比如中文的话,就修改成

  1. config.i18n.default_locale = 'zh-CN'
复制代码


中文语言包需要到
https://github.com/svenfuchs/rai ... ls/locale/zh-CN.yml下载

下载好后放置在 config/locales 目录下即可。 然后重新启动服务器

并且,我们可以自定义其中的语言,
比如程序中的 number,

  1.     models:
  2.       member: 会员情报
  3.     attributes:
  4.       member:
  5.         number: "会员编号"
  6.         name: 会员昵称
  7.         full_name: 会员姓名
  8.         gender: 性别
  9.         gender_0: 男
  10.         gender_1: 女
  11.         birthday: 生日
  12.         email: 邮箱
  13.         administrator: 管理员
复制代码


不过此处注意的是,必须按照其他行的格式进行修改否则会出错

反过来,如果想在中文下显示原来的英文,可以使用
I18n.t("member.number")或是 t("member.number")来显示

 楼主| 发表于 2016-3-25 08:45:41 | 显示全部楼层
测试

当今最新的测试,都使用测试脚本来进行测试,测试所涉及的方面有以下几点

■表象
  • 访问存在的页面时,页面是否能够正常的显示
  • 正确操作的时候,程序的状态是否正确的执行
  • 错误操作的时候,程序是否能够显示适当的错误信息


■模型测试(数据库测试)
  • 模型的搜索功能(find),是否能够取得正确的数据
  • 模型的更新功能(save),是否能偶正确的保存数据
  • 模型的更新功能如果不正确的时候,是否能够显示适当的错误信息


■控制器测试
  • 是否选择了正确的模板
  • 实例中的变量是否放置了正确的值
  • 渲染是否正确


■其他测试
  • 用户登录系统
  • 其他



执行测试脚本

  1. rake test test/models/member_test.rb
复制代码


如果以文件夹为单位的测试
  1. rake test::models
复制代码


如果全部测试
  1. rake test
复制代码


Factory Girl  可以利用此系统制作专用的测试数据
■测试数据准备

首先修改程序根目录下的 Gemfile
在里面添加
  1. group :test do
  2.         gem 'factory_girl_rails'
  3. end
复制代码


并执行安装 bundle install

test 目录下创建一个factories文件夹

输入测试文件 members.rb
  1. FactoryGirl.define do
  2.         factory :member do
  3.                 sequence(:number) {|n|n+1}
  4.                 sequence(:name) {|n| "Taro#{n}"}
  5.                 full_name "Yamada Taro"
  6.                 sequence(:email) {|n| "taro#{n}@example.com"}
  7.                 gender "0"
  8.                 birthday 30.years.ago
  9.         end
  10. end
复制代码


再到 test/models/member_test.rb 修改
  1. require "test_helper"

  2. class MemberTest < ActiveSupport::TestCase
  3.         test "factory girl" do
  4.                 member = FactoryGirl.create(:member)
  5.                 assert_equal "Yamada Taro", member.full_name
  6.         end
  7. end
复制代码


执行
rake test 测试
 楼主| 发表于 2016-3-31 03:49:26 | 显示全部楼层
资源通道(Asset Pipeline)及 公开

Rails将所有在 app/assets 文件夹下的 CSS, JavaScript,进行加工整合。节省了我们制作好站点后的各种优化工作。

■正式版
将做好的程序打包,正式公开我们需要以下几个步骤

Mac 和 Linux
  1. export RAILS_ENV=production
  2. export RAILS_SERVE_STATIC_FILES=1[code]
  3. [b]WIndows[/b]
  4. [code]set RAILS_ENV=production
  5. set RAILS_SERVE_STATIC_FILES=1
复制代码


接着我们要生成公开的安全key
Mac 和 Linux
  1. rake secret > secret.key
  2. export SECRET_KEY_BASE=$(cat secret.key)
复制代码

WIndows
  1. set /p SECRET_KEY_BASE=$(cat secret.key)
复制代码


■资源通道确认

  1. rake assets:precompile
  2. rake db:setup
  3. rails s
复制代码

 楼主| 发表于 2016-4-5 08:08:48 | 显示全部楼层
模型间关联

常使用的方法
has_many 一对多关联
  1. has_many :wheels
复制代码

belongs_to 参考对象关联
  1. belongs_to :car
复制代码

has_one 一对一关联
  1. has_one :engine
复制代码

多对多
  1. has_many :race_entries
  2. has_many :drivers, through: :race_entries
复制代码


您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|小黑屋|日星网 ( 黑ICP备07001742号 )

GMT, 2018-11-21 10:07 AM , Processed in 0.024405 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表