zoukankan      html  css  js  c++  java
  • [ROR] ruby on rails 入门知识

    view

    view分为 builder模式和rhtml模式

    builder模式例子如下,rails自带

    xml.div(:class => "productlist") do
    xml.timestamp(Time.now)
    @products.each do |product|
    xml.product do
    xml.productname(product.title)
    xml.price(product.price, :currency => "USD")
    end
    end
    end

    如果标记和内置方法重复,可以使用something!()来产生标记

    rhtml类似于jsp, <%=...%>输出 <%...%>纯标记 <%...-%>自动删除自己的空行

    h方法提供了html encoding
    Helper

    XXXController都会对应一个 XXXHelper(xxx_helper.rb)来写帮助方法, 这些方法在rhtml中都可见

    要实现跨controller调用,可以

        * 在application_helper.rb中写方法
        * 在controller中通过helper :some_helper.rb导入
        * 在controller中通过helper SomeHelper导入(类已经栽入的情况下)

    通过helper_method 还可以把controller中的方法变为helper,但是这样作不推荐,破坏封装

    rails内置了很多helper可用,比如各种单位的换算helper(对view特别有意义),详情查阅rdoc 特别的helper有

        * debug 把对象以html可见的方式打印在页面,方便调试
        * simeple_format 简单的格式化string,添加

          段落和
        * excerpt 给字符两边添加... "...Some words fo..."
        * highlight(string,highword) 添加...
        * truncate(sring,maxlen) 给字符右边添加... "hello this is my..."
        * pluralize(num,word) 自动添加复数形式 1 person -> 2 people
        * markdown 文章filter
        * texttile 文章filter

    处理链接

    link_to "xxxx",{hash},{hash}

    第一个是链接文字,第二个hash和url_for的一样,第三个hash是用户自己在<a>中添加的标签,比如

    <%= link_to "Delete", { :controller => "admin",
    :action => "delete",
    :id => @product
    },
    { :class => "redlink",
    :confirm => "Are you sure?"
    }
    %>

    button_to 的参数和link_to一样, 产生一个button来跳转(安全的POST协议),但是button_to要单独在一个form里面,html不允许嵌套form

    link_to_unless_current 自动识别当前链接, 如果当前url和链接一样, 就只产生文本

    image_tag嵌套进入link_to

    mail_to 有一个:encode=>"javascript" 可以实现把email地址编码防spider

    stylesheet_link_tag 添加css

    auto_descovery_link_tag 自动申明rss

    默认所有的image在/images css在/stylesheets,除非显示使用/xxx来指定根路径另外可以修改 ActionController::Base.asset_host = "http://media.my.url/assets" #共同的prefix 这样可以实现静态内容专门在一一起
    分页

    分页涉及到controller和view两个部分在controller中 Paginator对象, 专门负责分页 ,默认分页为10个一页

    @user_pages, @users=paginate(:users,:order_by =>'name')

    在页面里面使用<%=pagination_links(@user_pages)%> 会自动产生页面链接

    详情查阅RDoc
    表单处理

    本质上rails是简单的把上行的参数设置为层次分明的hash(aaa.bbb.ccc 映射为 aaa[bbb][ccc]), 这样来和activerecord自动交换数据,但是也可以直接读取之

    param[:xx][:yy] rails推荐以symbol来读取(string也可以)

    大多数输入helper前两个参数分部是:variable和:attribute ,最后一个是增加的html options 例子如下 <%=xxx_field :variable,:attribute,options_hash%>

    注意 update_attribute会自动调用save方法
    表单处理 FormHelper中的方法(和Model绑定)
    普通输入框

        * text_field
        * hidden_field
        * password_field
        *

          text_area
        *

          radio_button 第三个参数是tag_value,当他和value相等的时候显示为selected
        * check_box value必须为true/false或者转换为int的值(非0为true) 倒数两个参数为on_value和off_value 为打开/关闭时提交的值, 默认为"1","0"

    列表

    select(:variable, :attribute,choices,options,html_options)

    choice参数为enumerable,当enumerable的元素为[a,b]这样的长度为2数组的时候,数组第一个元素为value,第二个为key

    collection_select(:variable,:attribute,choices,:inner_attr_for_key,:inner_attr_for_value)专门用来列表集合
    分组列表

    暂时不看 @@@
    日期输入框

    date_select(:variable,:attribute,options) datetime_select(..)是处理和model相关的日期

    select_xxx 是处理普通日期(直接通过params访问)

    没有怎么看明白有什么用处
    上传文件

    form中需要添加:multipart=>true,本质上然后通过对应的参数获得数据(一个StringIO) 通过read即可读取全面内容到string中然后就相当于拿到文件内容处理了
    错误处理

    上门的helper参数都会自动读取对于field的错误信息(errors.on(field)),发现错误以后会自动产生一个class=fieldWithErrors的div,通过css可以控制显示. 如果需要直接读取某个field的错误信息, 可以使用<%= error_message_on(:bean,:field)%>,读取所有错误使用<%= error_messages_for(:bean)%>
    FormTagHelper 和Model无关的方法

    FormTagHelper中的方法都比Form中多一个_tag结尾

        * start_form_tag和end_form_tag form开始结束
        * submit_tag 提交按钮

    其他FormHelper中的帮助方法都有一个对应的_tag版本,参数接受 :name,value,html_options

    例子如下

    <%=text_field_tag(:arg1,@params[:args],:size=>3)%>
    layout技术 (sitemesh式的模板)

    layout模板中可以访问所有对应页面中能访问的对象,还多有@content_for_layout参数来指向整个页面输出的内容

    自动查找: 一个xxx_controller对应了一个在layout下同名的xxx.rhtml/rxml作为他的layout,

    显式申明:

       1. 在controller中通过layout申明一个string, 支持:except和:only参数(过滤:action名)
       2. 声明为nil表示关闭layout
       3. 申明为一个:symbol表示通过当前类symbol方法获取string名

    string对应了 string.rhtml或者string.rxml

    直接render: 直接调用render(:layout=>"layouts/xxxx")可以使用layout,或者使用:layout=>false关闭layout
    partial page template 页面片断

    页面片断的页面必须以_开头命名,放在和controller相同路径下,使用render(:partial=>"xxx",:object=>@newinst)访问

    文件名必须ruby变量规范和文件名普通规范,通过:object注入的参数通过文件名访问,比如_myname.rhtml就得到了myname这个参数,要追加其他参数,使用:locals={...}

    如果忽略:object参数表示把@xxx 自动传入 _xxx.rhtml中的xxx变量, 也就是当@instance和partial中的变量名相同时候, 可以省略:object
    使用集合的partial

    通过 render(:partial=>"xxx" ,:collection=>xxx) 可以指定一个集合, 集合中的元素会传给partial content作为主元素,同时还会添加一个xxx_counter来作为index, 此时使用:spacer_template=>"yyy"还可以指定两个元素之间使用的空白template

    如果:partial=>"xxx/yyy" 指定的名字含有/ ,那么rails默认为这个路径从/app/views开始,通过这个方法可以做到多个controller使用一个partial conetent
    components 组件

    在页面中通过render_component使用 render_component(:controller=>'xxx',:action=>'fdas')

    需要注意的是要注意避免循环引用,所以一般用来作component的action最好使用render(:layout=>false...)或者在class中申明 layout "xxx","except=>:xxxx
    独立的component组件

        * 必须方在components/xxx下面
        * 使用XXX::MyController申明 必须在model xxx中
        * 类开头申明uses_component_template_root
        * 使用方式为<%%=render_component):controller=>'xxx/my',:action=>'yyy') %>
  • 相关阅读:
    XP系统忘记密码解决方法
    实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
    Spring.NET教程(三)——对象的创建(基础篇)
    Spring.NET教程(二)——环境搭建(基础篇)
    Spring.NET教程(一)——控制反转(依赖注入)(基础篇)(转)
    递归与迭代
    软件研发人员考核的十项基本原则(转)
    ORACLE多表关联的update语句
    软件质量的分层控制方法
    技术研究与工程开发(转)
  • 原文地址:https://www.cnblogs.com/lovebread/p/1633047.html
Copyright © 2011-2022 走看看