我是靠谱客的博主 沉默心情,最近开发中收集的这篇文章主要介绍ActiveRedord\Controller,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

【Rails之道】第2章 运用控制器(渲染,重定向,过滤器,流)
2010/07/21 10:09

01.渲染其他模板
render :action=>"new" #渲染到new这个action里
--------------------------------------------
02.渲染一个不同模板
render :template=>"user/index" #常用 app/views/user/index.rhtml
render :file=>"~/wwwroot/shop/app/views/user/index.rhtml"
--------------------------------------------
03.渲染局部模板
<%= render :partial=>'user' %> #这个是views一遍在一个模板,调用另一个模板(命名:_user.html.erb)
--------------------------------------------
04.渲染内联模板
render :inline=> "<%=auto_complete_result(@heading,'name')%>"
--------------------------------------------
05.渲染文本
render :text=>'I love badwolf'
--------------------------------------------
06.渲染json和xml
render :json=>@record.to_json
render :xml=>@record.to_xml
--------------------------------------------
07.什么都不渲染
render :nothing=>true,:status=> 401 #未授权
--------------------------------------------
08.渲染属性
:content_type (例如 text/html) 在web上东西都属于MIME规定类型..还有其他文件图片等
:layout 指定使用哪个布局模板
:status 307(暂时重定向) 401(未授权) 403(禁止访问) 404(NOT found) 503(服务不可用)
--------------------------------------------
09.重定向
#rails应用程序有他的生命周期,重定向就是结束这个周期,终止以前的,重新开始.
redirect_to :controller=>"main"
--------------------------------------------
10.过滤器
#过滤器可实现向下继承,
before_filter :audit #前置,
after_after :audit #后置,
around_after :test #环绕,例如测试程序运行时间,开始和结尾之间.
--------------------------------------------
11.过滤器类型
方法引用: before_filter :audit
外部类:   before_filter Output #注意没冒号
内联方法: before_fiter {|controller| false if controller.params["stop"]}
--------------------------------------------
12.过滤器排序
prepend
_before_fitler :audit #有这个在前面
--------------------------------------------
13.跳过过滤器(有时子类需要跳过父类的)
skip
_before_fitler :audit #有这个在前面
--------------------------------------------
14.过滤器条件(only和expcept)
:only=>:index #单一方法,
:only=>[:foo,:bar] #数组方法,
--------------------------------------------
15.过滤器挂起
让过滤器方法返回false,或render和redirect_to ,这里都会挂起
--------------------------------------------
16.流
send_data(data,options={})
send_data generate_agz('dir'),:filen=>'dir.tgz'
选项:
:filename 给浏览器指定名字
:type 给浏览器指定类型,默认application/octetstream
:disposition 指定文件下载(默认attachment ,显示inline)
:status 状态 默认"200 OK"

send_file(path,options={})
例:send_file '/path/to.jpg',:type=>'image/jpeg',:disposition=>'inline'
例:send_file '/path/404.html',:type=>'text/html;charset=utf-8',:status=>404
选项:
:filename 给浏览器指定名字 默认File.basename(path)
:type 给浏览器指定类型,默认application/octetstream
:disposition 指定文件下载(默认attachment ,显示inline)
:buffer_size 指定缓存大小4096 (每次发送大小,存点发点)
:status 状态 默认"200 OK"
--------------------------------------------
17.让服务器发送文件
节省内存的方法,
用Apache和Lighttpd
response.headers['X-Sendfile']=path
用Nginx
response.headers['X-Accel-Redirect']=path



00.渲染(render)和重定向(redirect_to)

--
render :controller=>"user",:action=>"new"
render :template=>"path/new" #很少用
render :file=>"/home/user/www/app/views/new/index.rthml" #必须绝对路径
render :inline=>"<%= %auto_complete_result(@headings,'name') %>" #渲染后内联代码
render :text=>'测试...'
render :json=>@record.to_json #渲染json格式
render :xml=>@record.to_xml #渲染xml格式
render :nothing=>true,:status=>401 #什么都不渲染 307暂时重定向,401未授权,403禁止访问,404没发现,503服务器不可用(:content_type=>'text/html',:layout=>'指定布局')
--
redirect_to :controller=>"main" #终止当前请求,重新启动另一个新请求.
------------------
01.过滤器继承
before_filter #前置过滤器(向下继承,可以是方法引用,可以是类,可以使内联方法)
------------------
02.过滤器分类
before_filter :方法
before_filter 外部类
before_filter {内联过滤器}
------------------
03.过滤器顺序
prepend_before_filter ... #优先级最高的前置过滤
------------------
04.Around过滤器
around_filter ... #在一个动作被执行的前后运行过滤器制定的代码.
------------------
05.跳过过滤器
skip_before_filter ... #跳过父类继承下来的过滤器
skip_filter ...
------------------
06.过滤器的条件
:only => :index #单一条件
:except => [:foo ,:bar] #多个条件数组方式
------------------
07.过滤器挂起
在过滤器中调用render或者redirect_to #例如拒绝未授权用户
------------------
08.流send_data和send_file
---
send_data(data,options={}) #允许你给用户发送制定名字发送文本活二进制数据.例如文件类型,文件名,显示方式等
:filename 制定文件名
:type 制定内容类型,默认application/octetstream
:disposable (默认attachment下载,inline显示)
:status 返给浏览器默认"200 OK"
例如:send_data generate_agz('dir'),:filename =>'dir.tgz'
---
send_file(path,options={}) #每次发送4096字节文件给客户端
:filename 文件名
:type 类型,默认application/octet-stream
:disposition(默认attachment下载,inline显示)
:stream (读取就发true ,读完再发false)
:buffer_size指定缓存文件大小(bytes)默认4096
:status 指定浏览器应答默认"200 OK"
:url_based_filename 让浏览器根据url判断文件名,默认true(filename会覆盖这个值)
例如:send_file '/path/to.zip' :type=>'image/jpeg',:disposition=>'inline'
send_file '/path/to/404.html',:type=>'text/html;charset=utf-8',:status=>404
send_file @video_file.path,:filename=>video_file.title+'.flv',:type=>'video/x-flv',:disposition=>'inline'
------------------
09.让web服务器发送文件
response.headers['X-sendfile']=path
response.headers['X-Accel-Redirect']=path

render :nothing =>true


【Rails之道】第6章 运用ActiveRecord
2010/07/08 16:32
由于"rails之道"这部分不如"敏捷开发" 写的好.我把他们乎呢好写道一起了...

01.创建新实例

#01.1
a=Article.new
a.new_record? # =>true
#01.2代码块
a=Artile.new do |art|
art.title = "世界杯"
art.state_id = 3
end
#01.3创建并保存(会保存数据库中)
a=Artilre.create(:title=>"世界杯报道团",:state_id=>1)
-------------------------
02.读取ActiveRecord对象
Article.find(1) #读取id为1的对象
Article.find(1,2) #读取id为1和2的对象
Article.find(:all) #读取全部对象
Article.find(:first) #读取第一条
Article.find(:last) #读取最后一条
Product.first(:readonly=>true) #只读查询
Article.find(:all,:conditions=>["title like ?","%#{a}%"])
Article.find(:all,:conditions=>["title like :title",:title=>"%#{a}%"])
Article.find(:all,:conditions=>["title like :title and price>:price",:title=>"%#{a}%",:prcie=>3])
-------------------------
03.把条件设置数组
>> conditions = []  #定义一个数组
=> []
>> conditions << ["title like ?", 'a']  #把一个条件加到数组
=> [["title like ?", "a"]]
>> conditions << ["title like ?", 'a']  if params[:title].present? #加一个判断 非空时加入到数组
-------------------------
04.include附加查询(减少N+1次查询)
LineItem.all :conditions => "products.title => 'a'", :include => :product
-------------------------
05.jions附加查询
LineItem.all :conditions => "products.title like '%a%'", :joins => :product
-------------------------
06.获取字段统计信息
Product.average(:price) #平均
Product.maximum(:price) #最大
Product.minimum(:price) #最小
Product.sum(:price) #球和
Product.count() #数量
-------------------------
07.重新载入
record.reload(:lock=>true)
-------------------------
08.动态查询
Article.find_by_id(1) #查询ID=1的内容
Article.find_all_by_channel_id(1).collect(&:state_id)  #找到Article对象,channel_id是1的所有对象,然后取所有对象的state字段,组成数组.
Article.find_all_by_channel_id(1).map(&:state_id)  #同上 array.map {|item| item.state_id } → an_array
Article.find_all_by_channel_id_and_id("1","1") #查询频道=1 并且 ID=1的内容
Article.find_by_sql("select * from article") #直接运行sql
Article.find_by_title_and_price("测试",78.9) #只查第一条first 结果:title和price
Article.find_all_by_title_and_price("测试",78.9) #返回数组 结果:title和price
Article.find_or_create_by_title("hahahaha") #查询并保存
Article.find_or_initialize_by_title("aoiokkok") #查询,如果没有初始化
-------------------------
09.查询缓存
-------------------------
10.查看日志
tail -f log/development.log
-------------------------
11.表关系
LineItem(model)
belongs_to:product
-------------------------
l = LineItem.first
l.product #相当 SELECT * FROM "products" WHERE ("products"."id" = 1)
l.product(ture) #重新读取数据库,默认false读取内存
-------------------------
12.通过关系进行赋值
p=Product.last
l.product = p
l
-------------------------
13.多表操作(同时保存2个表数据)
l.num="15"  #LineItem的数据
l.build_product(:title=>"a",:price=>"3") #product的数据
l.save
-------------------------
14.只一个表储存,不需要svae
l.create_product(:title=>"a",:price=>"3")
-------------------------
15.杂项
order(model)
has_many:line_items
order(model)
has_one:其他

dependent=>:destroy #订单删除同时删除订单项,可以调用before_destroy之类的,会删除孙子表
dependent=>:delete  #订单删除同时删除订单项,但不调用before_destroy之类的 (has_many是:delete_all)
dependent=>:nullify #订单删除,不删除删除订单项,但把订单项目里到ID为空:

o=Order.first
o.line_items << LineItem.new #新加入项目 到 订单项目里 单条 直接保存.save

>> o=Order.first
=> #<....>
>> o.line_items << LineItem.new(:product_id=>"2",:quantity=>"12",:total_price=>"1368")
=> [#<.....>]
>> o.save
=> true

o.line_items.push(LineItem.new) #多条 

o.line_items.replace(LineItem.find(1),LineItem.find(2)...) #把多条内容替换当前单里到所有

o.line_items.delete(LineItem.all) #删除关系多条   destroy delete_all destroy_all

o.line_items.clear #清除两表关系 

o.line_items.find(line_item1,...) #查找..

o.line_items.count(line_item1,...) #计数
>> l = o.line_items.count
=> 3

>> o.line_items.empty? #是否为空
=> false


最后

以上就是沉默心情为你收集整理的ActiveRedord\Controller的全部内容,希望文章能够帮你解决ActiveRedord\Controller所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部