ror学习小结5
1 一对一关系,假设student和mealcard为两个一对一关系的类
class Student < ActiveRecord::Base
has_one(:meal_card, :class_name => "MealCard", :foreign_key => "student_id")
end
class MealCard < ActiveRecord::Base
belongs_to(:student, :class_name => "Student", :foreign_key => "student_id")
end
2 一对多关系
比如产品和分类一对多关系
分类:
class Type < ActiveRecord::Base
has_many(:products,:class_name=>"Product", :foreign_key=>"type_id")
end
class Product < ActiveRecord::Base
belongs_to(:type,:class_name=>"Type", :foreign_key=>"type_id")
end
调用:
<% @types.each do |type| %>
<% type.products.each do|p| %>
<tr>
<%if(temp_id != type.id)
temp_id = type.id %>
<td rowspan="<%= type.products.size %>"><%= type.id %></td>
<td rowspan="<%= type.products.size %>"><%= type.name %></td>
<% end %>
<td><%= p.name %></td>
<td><%= p.model %></td>
3 多对多
比如角色和function的多对多关系
class Role < ActiveRecord::Base
has_and_belongs_to_many(:functions,:class_name=>"Function",:join_table=>"functions_roles")
end
class Function < ActiveRecord::Base
has_and_belongs_to_many :roles
end
4 无限分级的菜单
class Menu < ActiveRecord::Base
belongs_to(:parent,
:class_name=>"Menu",
:foreign_key=>"parent_id")
has_many(:childs,
:class_name=>"Menu",
:foreign_key=>"parent_id")
end
5 使用activerecord中的事务处理
比如
类名.transcation do
.....
end
6 validate自定义
validate_on_create:在数据库创建记录时,对保存的数据验证
validate_on_update:在修改记录时,对数据进行验证
class User < ActiveRecord::Base
def validate
if name.blank?
errors.add(:name, "姓名不能为空!")
end
if year < 1910 or year > 2011
errors.add(:year, "出生年份必需在1910年到2011年之间")
end
if sex.blank?
errors.add(:sex, "性别不能为空!")
end
if not phone.match(/((0\d{3}|\d{2})-(\d{7}|\d{8}))|(1\d{10})/)
errors.add(:phone, "电话号码格式错误!")
end
end
end
<% if @user.errors.any? %>
<div id="error_explanation">
<h2>您输入的数据存在<%= pluralize(@user.errors.count, "") %> 处错误:</h2>
<% @user.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
</div>
<% end %>
7 自定义模型校验器
比如validate_presence_of方法 ,可以一次校验多个属性,比如
validate_presence_of(:name,:address......)验证多个属性非空
唯一属性:
validates_uniquencess_of(:name,:message=>"wrong")
例子:
class Account < ActiveRecord::Base
validates_presence_of(:name, :password, :message => "不能为空!")
validates_length_of(:name, :password, :within => 6..50, :message => "长度不合法")
validates_format_of(:name, :with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/, :message => "格式错误!")
end
8 定义各种before,after的回调方法
def before_delete
.,,,
end
9 默认路由放在config文件夹下的route.rb中,路由类型
1) 默认的路由为route.rb中的最底部一行,即/controler/action/:id的形式
2) 资源路由
比如resouces:users
则同时生成7个不同的路由
_url方法:生成完整的URL绝对路径
_path:生成相对路径
比如users_url:生成http://localhost:3000/users
users_path 生成/users
:as选项
resources :users,:as =>"memebers"
指定了URL中使用members,但路由还是users
/members index
/members/new
resouces :users,:controller =>"members"
指定使用members 控制器
3)修改选项
可以重写选项,比如
map.resources :users,:path_name=>{:new=>'add',:edit=>'modi'}
只不过方法名变了
/users/add
/users/1/modi
4)path_prefix选项
增加一个前缀比如
resources :users, :path_prefix =>"/showrole/:user_id"
则变成
/showrole/1/users/
/showrole/1/users/2
5) resetful
resources :users,requirment =>{id= >/[A-Z][a-z][0-0]+/}
这个将会不会识别ID=1的数据
6)only产生指定的路由
resoucrs :photos,nly =>[:index :show]
7)except指定哪个路由不被产生
resoucrs :users, :except =>:destory
10) 命名路由
match 'welcome',:to=>'users#index', :as=>'welcome'
创建了一个welcome的路由,调用user控制器的index方法。
11)嵌套路由
比如获得id=100的评论,该评论指向id=50的文章
/articles/50/comments/100
12) 正则路由
例子:
#实现查看指定日期的文章,例如 blog/articles/2011-02-14
# match 'blog/articles/:date' , :action=>'search', :controller=>'blog',
# :date=>/\d{4}-\d{2}-\d{2}/
#实现查看某一年的所有图片,例如photos/2011/all
# match 'photos/:year/all' ,:action=>'search' , :controller=>'photos' ,
# :year=> /\w{4}/
#实现查看某个关键字的所有文章,例如articles/show/rails
# match 'articles/show/:key' => 'articles#searchkey', :via =>OST
#实现按编号查看某个分类下的所有文章,例如blog/index/1
# match 'blog/index/:category' =>"blog#index", :constraints => {:category => /\d/}
# 实现用户对某篇文章的管理操作,例如users/1/admin
# match 'users/:id/admin' => 'users#admin', :as => :admin
#实现用户登录后进入的页面
# match 'user/homepage/', :action=>'login', :controller=>'users' ,:defaults=>{:homepage=>'usercenter'}
14 actioncontroller的6个对象
1) sessions
session[:username]="sdsd"
获得#{session[:username]}
session[:username]=nil
2)params[:user][:name] 访问user类的name属性
3)request
4)response
5)renders
render :action=>"success" //使用success模版
6)redirects
redirect_to :action=>'show', :id=>@entry.id
返回到show的action,并指定id
15) 用户自定义控制器<<ApplicationController<<actioncontroller<<base
16) 自定义模版
def index
@users=User.all
render :action=>"list"
end
表示使用app\views\user下的list.htm.erb文件模版
17) 自定义layout模版
也可以用render :action=>"list",:layout=>"users"
//表示不使用app\views\layouts下的文件夹,而使用app\views\layouts下的新建立的
users.htm.erb文件
18 局部模版
以_开头的
render :partial=>"showuser"
局部模版开头以_showuser开头
19 内嵌模版
def inline
@users = User.all
render :inline=>"<h3>查看所有用户</h3>