`
不想长大
  • 浏览: 6685 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

初学ruby on rails

阅读更多
active controller

model指令 提前load model对象 modelroduct
基本对应关系

http://xxx.com/admin/hello/list 对应为app/controllers/admin/hello_controller.rb中的list方法如下 module Admin class Hello def list end end end

ctroller是每次都新建
url自动映射 map.connect

在config/routes.rb中可以定义最底层的url和action对应的关系,这使得rails的url映射可以异常灵活,

默认的映射如下 map.connect ':controller/:action/:id' 他会自动匹配有三段的url请求, 详细的规则如下

    * url按照前置的"/"分段为components
    * ":name"会创建以name为名的参数,同时把对应url段赋值给它
    * "name" 匹配所有剩下的url段,会创建以name为名的数组,"name"只能出现在最后
    * 其他以文本出现字符的均严格匹配

map.connect接受的参数如下

    * :defaults=>{:name=>'value',...} 设置对应name的url段默认值,比如:action=>'index'
    * :requirements=>{:name=>/regexp/,...} 要求对应name的url段必须匹配的正则表达式
    * :name=>value 也是设置默认值, 不过这个对应的name可以自己取, 不一定必须要在url匹配中出现,相当于追加的参数
    * :name=>/regexp/ 和:requirements一样的功能, 设置正则

url自动产生 url_for

和url自动映射对应, rails可以利用map.connect中存储的信息来自动构造url,实现友好的url功能如默认设置中, 通过url_for :controller=>"xx",:action=>"fda",:id=>"fdas"可以构造这三个特殊的url段

url_for会根据传入的url来填写默认值, 比如url_for(:action=>"fda")会默认:controller为当前的,假设url段为目录那样的结构,url_for默认值工作如下: 子目录变化,他的父级目录都会填入默认值,但是他的子级目录都会舍弃, 这里的变化是值的变化,显式赋相同的值是没有变化的

如果要阻止url_for智能默认值,可以显式的赋最高级目录为nil,这样从最高到下的默认值都舍弃了

如果改变了高级,仍然要低级不舍弃, 可以通过url_for(:overwrite_params=>{:xxx=>yyy})来完成, 这样rails会认为没有改变, 所有低级目录段都会填充进来

url_for的扩展参数

    * :anchor 指定anchor(页内联接),rails会自动添加#
    * :host 指定主机(可以带端口)
    *nly_path 只产生path, host, port,protocol都省略
    * :protocol 协议名 比如"https://"
    * :trailing_slash 在末尾添加"/",注意有报告说末尾有"/"的时候,页面cache系统有混乱

to_param

实现了to_param的对象, 在传入url_for的时候, 会自动抽取to_param的值,否则会抽取to_s, rails的model的to_param会自动获取id
命名routes map.xxx

使用map.xxx 来代替map.connect 可以创建一个xxx的route,这个route还对应了一个xxx_url的方法,使用和url_for一样,只是规则只针对当前route
action方法

rails会自动把url请求转发到对应的controller类的方法中, 这个方法就叫action方法, action方法如果没有找到,会调用method_missing,传入action名和空参数列表, 如果没有action方法调用,rails直接跳转到action对应的template中实现纯view ,如果没有找到action, 就报错Unknown Action

隐藏方法: private或者hide_action都可以 注意 如果使用hide_action的目的是想公开private的方法给其他类, 可以考虑使用helpers类来完成, hide_action为下策也
controller环境对象

    *

      request
          o domain() 主机名
          o remote_ip() 远程ip
          o env 访问浏览器传过来的参数
          o method http请求方法 :delete, :get,:head,:post,:put
          o delete?,get?,head?,post?,put? 返回true or false
    *

      params 相当于jsp.parametermap,类似hash.使用params[:xxx]和params['xxx']等价, 推荐前者
    * cookies 和params类似
    * response 一般不用到它, 在filter中可能用到
    * session
    * headers 输出给浏览器的HEADER
    * 还有一个logger对象

response处理

三种处理 1.使用view模板输出 2.直接render文本 3 输出其他数据(pdf,文件)

response只能被render一次, 再次render会产生DoubleRenderError 注意 使用erase_render_results可以清除以前的render,但是这个方法无任何保证( undocumented method)

rails检查render,如果controller执行完毕以后还没有render,就会去调对应的view,如果render了, 就不掉view了
使用view输出

模板有.rhtml和.rxml(builder)两种, 默认在app/views/control/* 中, 默认位置app/views/可以通过ActionController::Base.templdate_root=xxx来更新设置
直接render文本

    * render(:text=>string) 直接render出文本
    * render(:inline=>string,[:type=>"rhtml"|"rxml"]) 把传入的string当成模板处理, 相当于rhtml的内容
    * render(:action=>action_name) 直接调用某个action的模板,相当于forward到一个view
    * render(:file=>path;[:use_full_path=>true|false]) 使用某个模板文件render, 当use_full_path打开时可以传入相对路径
    * render(:template=>name) 使用模板名render ,例子如下 render(:template => "blog/short_list") # 自动使用/app/views/blog/short_list.rhtml(rxml)
    * render(:partial=>name) ???
    * render(:nothing=>true) 什么也不输出,包括layout
    * render() 默认的的render, 相当于render(:action=>self)

所有的render都接收:status 和:layout两个额外参数 :layout为false的时候表示不使用layout, nil和true都表示使用layout :layout为string的时候, 使用string表示的名字的layout

使用render_to_string(用法和render一样)可以得到输出的string而不是直接输出到浏览器
输出其他数据

send_data(data,options...) 支持的options有

    * :filename 给浏览器建议的文件名
    * :type 文件类型,默认为"application/octet-stream"
    * :disposition 给浏览器的处理建议,"inline"表示直接显示,"attachment"表示下载另存

send_file 和send_data一样, 多了一个参数:streaming,当stream为false的时候,整个文件被读入内存传输,反之则使用:buffer_size传输流
redirect

    * redirect_to(:action=>'xxx') 使用语法和url_for一样(底层用url_for)
    * redirect_to("/localpath")
    * redirect_to("http://url")

默认的redirect都是tempoary
cookies

cookies必须使用string值 ,如果使用其他value ,可能会有"private method ‘gsub’ called" 这样的错误

cookies的扩展参数 例子如下

cookies[:marsupial] = { :value => "wombat",:expires => 30.days.from_now,:path => "/store" }

    * :value 直接的value
    * :domain 存储和访问的地址
    * :expires 过期时间
    * :path 和domain共同决定存储和访问地址
    * :secure 是否只在https//中使用

session

session默认存为文件的, 可以通过删除它们实现更新class结构冲突(旧对象和新对象不一样)

关于session具体配置可以在config/environments中配置,(session过期时间除外)

例子如下

ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS[:session_key] = 'my_app'

    * :database_manager Controls how the session data is stored on the server. We’ll have more to say about this shortly.
    * :session_domain The domain of the cookie used to store the session id on the browser. Defaults to the application’s host name.
    * :session_id Overrides the default session id. If not set, new sessions automatically have a 32-character key created for them. This key is used in subsequent requests.
    * :session_key The name of the cookie used to store the session id. You’ll want to override this in your application, as shown previously.
    * :session_path The request path to which this session applies (it’s actually the path of the cookie). The default is /, so it applies to all applications in this domain.
    * :session_secure If true, sessions will be enabled only over https://. The default is false.
    * :new_session Directly maps to the underlying cookie’s new_session option. However, this option is unlikely to work the way you need it to under Rails,and we’ll discuss an alternative in Section 16.8, Time-Based Expiry of Cached Pages, on page 323.
    * :session_expires The absolute time of the expiry of this session. Like :new_session, this option should probably not be used under Rails.

更多设置查阅CGI::Session的文档

DEFAULT_SESSION_OPTIONS还有一个database_manager能配置session的存储方式(:database_manager=>xxxx),列表如下

    * CGI::Session::PStore 默认的存储方式,使用marshal
    * CGI::Session::ActiveRecordStore 使用ActiveRecord存储到表中 create table sessions ( id int(11) not null auto_increment, sessid varchar(255), data text, updated_at datetime default NULL, primary key(id), index session_index (sessid) );
    * CGI::Session::DRbStore 使用drbserver访问,自带有一个drb_server.rb
    * CGI::Session::MemCacheStore 使用缓存系统 ???
    * CGI::Session::MemoryStore 直接内存存储,不推荐
    * CGI::Session::FileStore 直接文件存储,不推荐,只能支持string存储

设置 ::ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS = false可以禁用所有session以及依赖session的功能(flash)
session存储方式比较

查看这里 http://media.pragprog.com/ror/sessions/, 一句话 先用最简单直接的,等到速度变慢时候认证测量, 然后再决策,不要overkill
session清除

rails目前比较原始, 居然要自己去清除, 写crontab吧(清文件, 清table) ???
flash

flash的生命期是两次request,底层使用session保存对象 flash.now创建临时的flash(一个request内) flash.now[:xxx] flash.keep延迟一个request的生命期 flash.keep(:xxx) 或者flash.keep(全部)
filter

before_filter after_filter around_filter

设置filter的参数可以为一个方法symbol :method_a ,一个block 或者一个类, 该类的静态方法self.filter()会被调用 默认filter作用于当前类的所有action方法和子类的action方法,nly 和 :except用来在controller中包含或者排除action

before_filter 和after_filter默认是添加filter到filter chains最后, 如果要添加到最前使用prepend_before_filter() 和 prepend_after_filter()

before_filter 主要用来作验证 after_filter 主要用来控制内容(压缩,替换) around_filter 可以用来记录时间 设置参数必须为一个类, 该类有before(controller)和after(controller)两个方法 around_filter XXXFilter.new

around_filter的添加是嵌套的, around_filter A.new,B.new的结果如下 A.before B.before action..... B.after A.after 注意顺序和前面两个filter不一样
filter 在继承中的关系

子controller会执行所有父controller的filter,但是父不会执行子的filter
verification

verify指令可以看做一个专门抽出来的filter功能,当verify失败, 当前action就不会执行了 class BlogController < ApplicationController verifynly => :post_comment, :session => :user_id, :add_flash => { :note => "You must log in to comment"}, :redirect_to => :index #.... end 支持的参数如下启用条件nly=>:name or [:name,...] :except=>name or [:name,...] 测试条件 :flash=>:key or [:key,...] flash中必须包含某些key :method=>:symbol or [:symbol,...] 请求必须是某些http 方法 :session=>:key or [:key,...] session中必须包含某些key 执行操作 :add_flash=>hash 把传入hash的值对写入flash中 :redirect_to=>params 跳转页面
分享到:
评论
2 楼 taotao6086 2009-02-23  
render(:partial=>name) 添加模板.主要在页面中使用.
1 楼 taotao6086 2009-02-23  

相关推荐

    ruby on rails 101

    《Ruby on Rails 101》是一本介绍Ruby on Rails(简称RoR或ROR)的基础书籍,旨在为初学者提供一个全面而深入的学习框架。本书由Peter Marklund编写,包含了五天课程的演示文稿和相关资料,覆盖了从安装到实际应用...

    Ruby On Rails中文教材(PDF)

    本中文教材《Ruby On Rails》可能是针对初学者和有一定编程基础的开发者设计的,通过PDF格式提供,便于读者在线阅读或离线保存。PDF文档通常包含详细的教程、实例代码和可能的练习题,旨在帮助学习者全面了解和掌握...

    Ruby on Rails安装包全集(Linux)

    Ruby on Rails是一款基于Ruby语言的开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,简化了Web应用的开发流程。在Linux环境下安装Ruby on Rails需要一系列的依赖包和步骤,本资源包提供了所需的所有组件,...

    ruby on rails最新版

    总的来说,这个压缩包对于Ruby on Rails的初学者或希望升级现有项目的开发者来说,是一个宝贵的资源。它提供了便捷的方式来获取和安装Rails框架,从而快速进入开发状态。不过,使用前应确保已安装好Ruby环境,并了解...

    ruby on rails 3 tutorial.pdf

    《Ruby on Rails 3 Tutorial》是一本专门为初学者设计的指南,旨在帮助读者快速掌握Ruby on Rails这一强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby语言的一个开源框架,它采用MVC(Model-View-...

    Ruby on Rails入门权威经典

    《Ruby on Rails入门权威经典》是一本专门为初学者设计的指南,旨在帮助读者全面掌握Ruby on Rails这一强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby编程语言的开源框架,以其“DRY(Don't Repeat ...

    ruby on rails for dummies

    《Ruby on Rails for Dummies》是一本专门为初学者设计的Ruby on Rails教程,它旨在帮助新手快速理解并掌握这个强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby编程语言构建的一个开源Web应用程序框架,它...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    Ruby on Rails中文指南

    Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在提升开发效率和代码的可读性。Rails以其“约定优于配置”的设计理念,以及“DRY(Don't Repeat ...

    Ruby on Rails入门经典代码

    本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...

    Ruby on Rails入门经典

    Ruby on Rails,简称Rails,是一种基于Ruby编程语言的开源Web应用程序框架,以其“Convention over Configuration”(约定优于配置)和“Don't Repeat Yourself”(DRY,不要重复自己)的原则著称。Rails使得开发Web...

    ruby on rails api

    Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,专为敏捷开发而设计,强调简洁的...对于Ruby on Rails初学者和经验丰富的开发者来说,这样一份详尽的API文档都是不可或缺的学习和工作资源。

    ruby on rails 书全集(10余本经典著作PDF版)

    这套书全集包含了10余本经典著作,涵盖了从初学者入门到高级开发者的深入研究,对于想要全面掌握Ruby on Rails技术的读者来说,是一份宝贵的资源。 首先,我们来看看基础篇。在学习任何新技术时,扎实的基础是关键...

    Learn Ruby on Rails

    文件中提到的“Learn Ruby on Rails”是一本为Ruby on Rails初学者准备的入门教程。该书因其文字表达清晰,代码示例中采用彩色高亮,方便阅读和理解。它还包含目录,使得读者能够快速定位感兴趣的主题或遇到的问题。...

    Ruby on Rails入门例子

    Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...

    Ruby On Rails教程

    ### Ruby on Rails 教程知识点概述 #### 一、引言 - **敏捷开发与Rails:** 本书《Ruby on Rails教程》强调了Rails作为敏捷开发框架的优势。它旨在帮助开发者快速构建高质量的Web应用程序。 - **作者团队:** 本书...

Global site tag (gtag.js) - Google Analytics