Rails5 View Document

更新: 2017/06/11
更新: 2017/06/15 加粗,submit必须放在form_for内部
更新: 2017/06/23 对待完成的追加# TODO:
                          增加了form_for 选项默认情况的说明
                          增加了调用form_for/tag时要加<%=>
                          只加了submit_tag
                          补充: render action: 't1' 和render 'sample/t1'效果一样
更新: 2017/06/27 增加了各类field的书中位置p111
更新: 2017/06/29  增加了fabicon设置里地址的描述
更新: 2017/07/01  增加了link_to里文字自定义的方法
事故: 2017/07/01 上面那个更新把样例代码复制过来了,结果因为垃圾新浪博客大于小于号<>的bug直接被吞,后面内容全没了。
修复: 2017/07/02 重新填上垃圾新浪造成的坑,顺带鄙视新浪全体工作人员
更新: 2017/07/11 补充参数的含义
总结: 2017/08/13 呼出模板传递变量  render ..., 变量名: 值
                          向外部传递变量 provide  接收: yield(:变量名)
                          增加 hidden_field_tag
更新:  2017/08/17 增加了面向全体helper的名称
                           增加render传递参数的条件:  部分模板
更新:  2017/09/04 修正了submit按钮的确认信息表示方法 data: {confirm: '...', disabled_with: '...'}
                          增加了check_box_tag
更新:  2017/09/07 增加了部分模板路径的补充
更新: 2017/09/11 修正了部分模板处传递参数的写法(locals: {sample: @value}
更新: 2018/02/06 在link_to处增加多个选项用{}包围, 纠正method的默认选项 get
更新: 2018/02/07 增加视图相关的逻辑方法栏并增加current_page?
更新: 2018/03/06 完善layout相关
                         替换: 《 ---> <   ,   》 ---> >
更新: 2018/03/07 补充了呼出模板时候省略一部分路径的规则: [和主模板在同级文件夹时可省略文件夹]
更新: 2018/03/20 完善向部分模板传递参数
更新: 2018/03/29 纠正平写错误 [grounped_collection_select] -> [grouped_collection_select]
          补充了 grouped_collection_select 的参数说明
更新: 2018/09/30 补充current_page?参数情况, 修改错误的content_for代码
更新: 2019/04/11  修正部分模板处的小错误并补充呼出时的路径写法
更新: 2019/04/17  修正并重构form助手相关描述(跳过select_xxx和其他的表单助手)
                          统一所有table宽度为100%, 保证美观
                          添加content_for?
 
视图助手(view helper)
 表单视图助手
 form
 

 没有动作方法(action method)的话直接呼出模版文件

 需要设定route(相当于不需要controller)

  
 分类

 

 form_tag 生成不涉及Model的表单
 form_for/form_with 生成编辑特定Model对象的表单

 

 具体视图助手 

 

 FormTag助手

 和Model无关的通用型

 

 label_tag 
 text_field_tag 
 file_field_tag 
 check_box_tag 
 radio_button_tag 
 select_tag 
 submit_tag 
 hidden_field_tag 
  
  

 

 Form助手 

 参数: 对象名 属性名 其他

 例 text_field :book, :title, size:25

 label 
 text_field 
 file_field 
 check_box 
 radio_button 
 select 
 f.file_field 
 f.check_box 
 f.radio_button 
 f.select 

 

 f.Form助手 

 参数: 属性名 其他 

 前提: 模型路径用 resources来指定

 好处:不用指定模型对象;
          自动设置路径

 f.label 
 f.text_field
 f.password_field
 
 f.file_field 
 f.check_box  
 f.radio_button  
 f.select 
  

 

 

 

 

  

 form_tag

 生成通用表格

 

 定义

 

form_tag([url_opts [, opts]]) do
    ...
end


 ● 注意:调用要 <%= form_tag ... do> 

 ● 参数

 url_opts

 和 url_for 的参数一样

 也可以用pathHelper

 ● 例

{controller: :test, action: :t2}

  ● 注: 

 省略controller的话默认当前所在controller, 如 { action: :t2 } 

 controller 视图控制器名
 action 动作(方法名)(controller#method)
 host 主机名(覆盖现在的主机)
 protocol 协议名(覆盖现在的协议)
 anchor 锚名?
 only_path  是否返回相对url(是否省略协议/主机/接口)
 不指定host的话默认true
 trailing_slash 末尾要不要/
 默认false
 user HTTP识别用的用户名
 password HTTP识别用的密码
 只指定一个:back 链接向之前一个链接 
 (返回Referer header)


 

 opts

 

 method

 发送表格时的HTTP方法
 默认post

 

 multipart

 (enctype属性的'multipart/form-data'设定)
 上传文件时候使用 multipart: true
 其他时候不用管

 

 其他 <form>的要素,如id, class等
  

 

 

  

 

 form_for

 生成对象的特定表格

 
 定义 
form_for(var [, opts]) do |form|
   ...
end

 ● 注意:调用要 <%= form_for ... do> 

 ● 参数

 var 表单修改的对象Model
 opts

 

 url

 和url_for一样, 见form_tag

 也可以用pathHelper

 html

 和form_tag一样

 ● method, multipart, 其他(id, class等)

 


 ● 好处: 根据传入的Model的状态自动设定路径

 新建

# controller
def book
    @book = Book.new
end

# view
<%= form_for @book do |f|%>
# 相当于
<%= form_for @book, books_path, 
    html: {id: :new_book, class: new_book} do |f| %>

 编辑

# controller
def book
    @book = Book.first
end

# view
<%= form_for @book do |f|%>
# 相当于
<%= form_for @book, book_path(@book), 
    html: {id: :edit_book, class: edit_book_1, method: :patch} do |f| %>

 

  

  

 生成<input>, <textarea>元素

 ●   f.类型的 省略掉obj

 ●  _tag类型的 另外查

 xxxx_field

 text_field(obj, prop [,opts])

 password_field(obj, prop[,opts])

 file_field(obj, prop[,opts])

 hidden_field(obj, prop[,opts])

 color_field

 datetime_field

 email_field

 number_field

 search_field

 time_field

 week_field

 date_field 

 datetime_local_field

 month_field

 range_field

 telephone_field

 url_field

 参数

 

 obj

 对象Model实例

 ● f.类型下省略

 prop

 属性名

 ● 属性名必须是Model里实际存在的, 不然报错

 

 opts input/textarea对象的属性
 value 值
 checked/unchecked checked/unchecked时的value值
  

 

 text_area(obj, prop, [,opts]) 
 radio_button(obj, prop, value [,opts]) 
 check_box(obj, prop [, opts [,checked="1" [,unchecked="0"]]])

 ● 实际输出两个input

  <input type="checkbox"> ,  <input type="hidden"> 

   原因: 在checkbox没有被点击时传送[没选择]这一信息

 

  
  

 

 HTML5专用元素
 不对应html5的生成
 text_field
 
 color_field 选择颜色框
 datetime_field 输入日期时间框
 2017/1/1/1/0
 email_field 输入邮件框
 number_field 输入数字框
 search_field 搜索框
 time_field 输入时间框
 1/2/0
 1:02:00
 week_field 输入周框
 date_field 输入日期框
 2017/1/1
 datetime_local_field  输入日期时刻框
 (本地?)
 month_field 输入月份框
 range_field  滑块
 slider
 telephone_field 输入电话框
 url_field 输入网址框
  

 选择框/列表框

 
select(obj, prop, choices [,opts [,html_opts]])
 参数 
 obj 对象
 form_for下省略
 prop 指定对象的属性
 :sample
 choices 选项(options)
 数组或者哈希表
 数组 选项和值为数组元素
 哈希表 选项为哈希值
 值为哈希值对应的值
 opts

 选项
 指定多个的话用{}扩起来

 include_blank 最开头追加一个选项
 ● true为空
 ● 'test'则输出文本 
 disabled 指定无效化的选项
 字符串或者数组 
 selected 指定初始被选中的选项
 html_opts  <select>元素的属性
 指定多个的话用{}扩起来
  

 ● 例: 

select @allQusetionnaire, :question, ['first', 'second', 'third'], {include_blank: 'test', disabled: ['first'], selected: 'second'}, {multiple: true, size: 50} 

 

 

 集合框
使用数据库数据
collection box
 
collection_select(obj, prop, collection, value, text [,opt [,html_opts]])

 obj 对象
 form_for代码块下省略
 prop 指定对象的属性
 collection 生成选项的对象
 value 对象(collection参数)里指定为 value 的属性
 text  对象(collection参数)里指定为输出的文本的属性
 opt 和选项框/列表框一样
指定多个的话用{}扩起来
 include_blank 最开头追加一个选项
 ● true为空
 ● 'test'则输出文本 
 disabled 指定无效化的选项
 字符串或者数组 
 selected 指定初始被选中的选项
 html_opts <select>元素的属性
  
  
  
 选择框/列表框/集合框
 选项组块化
 
grouped_collection_select(obj, prop, collection, group, group_label, option_key, option_value [,opts [,html_opts]])


 ● 前提: 准备association

 ● 参数

 obj 对象
 form_for代码块下省略
 prop 指定对象的属性
 collection

 参数构成<optgroup>要素的对象数组

 group

 <option>的数据源
 collection的成员(member)

 ● 必须是collection的方法(返回一个数组), 获取下一级选项的数组/Model

  自动进行如下调用

collection.group

 

 group_label

 <optgroup>的标签元素,同时也是小组标签
 参数collection的属性

 ● 必须是collection的方法(返回一个值)

   作为选项群的标签文本

 option_key  <option>的value
  参数grounp的属性
 option_value <option>的文本
  参数grounp的属性
 opts  和选项框/列表框一样
 指定多个的话用{}扩起来
 include_blank 最开头追加一个选项
 ● true为空
 ● 'test'则输出文本 
 disabled 指定无效化的选项
 字符串或者数组 
 selected 指定初始被选中的选项
 html_opts  <select>元素的属性
  

 

 

 

 select_tag select_tag(prop, [opt_tags [,opts]])
 参数含义 
 prop 编辑对象
 opt_tags

 <option>选项 (字符串的数组) 

select_tag :test, raw("<option>a</option>
<option>a</option><option>a</option>")

 ● 生成选项的方法: options_xxxxx

 opts 

 opts + html_opts

 ● opts

 include_blank 最开头追加一个选项
 ● true为空
 ● 'test'则输出文本 
 disabled 指定无效化的选项
 字符串或者数组 
 selected 指定初始被选中的选项

 ● html_opts 

  <select>元素的属性 

  id, class等

 

 生成选项 options_xxxxx
 options_for_select(container [,select])
container  选项的数组或者哈希表
select  默认的选项
 指定是用value
  

 

 

 options_for_select

 

options_for_select(container [,selected])

 ● 参数

 container

 选项(数组或者hash)

 ● 数组

    value和text都是元素值

 ● 哈希表

   text=>value,

   即key对应输出文字, value对应value

 selected

 设置初始选中的值

 ● 指定的是value而不是text

 

 option_from_collection_for_select

 

option_from_collection_for_select(collection, value, text [,selected]

 ● 相当于 collection_select(obj, prop, collection, value, text [,opt [,html_opts]]) 

 ● 参数

 collection 对象
 value 设置为value的属性
 text 设置为text的属性
 selected 默认的选项
 指定是用value
  

 

 

 option_groups_from_collection_for_select

 option_groups_from_collection_for_select(collection, group, group_label, option_key, option_value [,selected])
 ● 相当于 grouped_collection_select(obj, prop, collection, group, group_label, option_key, option_value [,opts [,html_opts]]) 

 ● 参数

 collection

 对象Model

 <optgroup>用

 group

 collection的关联

 <option>用

 group_label

 collection的属性

 <optgroup>label的text

 option_key

 group的属性

 <option>的value

 option_value

 group的属性

 <option>的text

 selected 默认的初始选项
  

 

  
 选择时刻 
 datetime_select
 date_select
 time_select
 xxxx.select(obj, prop [,opts [,html_opts]])
参数 
 obj 对象名
 form_for下省略
 prop 指定对象的属性
 :sample
 choices 选项
 数组或者哈希表
 数组 选项和值为数组元素
 哈希表 选项为哈希值
 值为哈希值对应的值
 opts 选项
 指定多个的话用{}扩起来
 html_opts  <select>元素的属性
 指定多个的话用{}扩起来
 opts 指定多个的话用{}扩起来
 P128
# TODO: E055D2D0-BEB2-46F5-818C-B85B5238D596
  
  
  
例:
 datetime_select @allQusetionnaire, :question
 select_datetime
 select_date
 select_time
 select_year
 select_month
 select_day
 select_hour
 select_minute
 select_second
 select_xxxx(date [,opts [,html_opts]])
 和上面的差不多 
 date指定默认值,不可指定默认选项
  
 其他表格视图助手 
 标签
 <label></label>
 label(obj, prop, [,content] [,opts], &block)

 obj 对象名
 form_for下省略
 prop 指定对象的属性
 :sample
 content/&block <label>的内容
 &block为代码块
 opts  <label>的属性
  
  
  
  
  
  
 
 f.submit

 

f.submit([value [,opts]])

 提交所在form框架下的一切更新

 ● 例

form.submit 'update', {disabled: true, data: {confirm: 'ok?', disable_with: '...'}}

 ● 参数

 前提 在form_for代码块内部
 参数

 

 value  标题
 opts

 可选

 disabled 是否是提交按钮无效
 data 独自的数据属性(
 confirm 弹出确认框
 disable_with 按下提交后提交按钮无效
 并显示文字
 其他 id, class等<input>的属性

 

 

 

  

 

 

  
 form_for下编辑不同模型 fileds_for(var) do |f|
   ...
 end
 var: 模块对象
 form_for内部用
 
 field_set_tag
 整合多个表单
 field _set_tag([legend [,opts]) do
  ...
 end
 
 legend fieldset的标题
 opt's <fieldset>的要素


 生成<fieldset><legend>(field的标题)
  
  
  
  
  
  
  
  
  
  
加工类视图助手 
 自动转换换行
 加<p> 
 simple_format(text [,html_opts [,opts]])
 参数 text 字符串
 html_opts  

附加属性
 opts  运行选项

 opts 
 sanitize 删除标签
 默认false
 wrapper_tag 指定围绕字符的标签
 默认p
  
  
  
 html_opts 标签: :属性的哈希表
 例: {class: :sample, style: :"font-size: 20px"}
  
  
 simple_format '1111111111111111111', {class: :test, style: :"font-width:bold; font-size: 20px;"}, {sanitize: false, wrapper_tag: 'h2'}
 剪裁字符串 truncate(text [,opts])
 
 参数 
 text 需要剪裁的字符串
 opts 动作选项
 opts 
 length 需要的字数
 默认30
 separator 到哪里位置
 不超过长度的最长的
 omission 省略除附加的文字
 注意:省略文字算在length里
 即length <= strLength + omiLength
 多出部分从str里剪裁
  
  
 注 不要用<%== ... %>输出剪裁过的文字
 可能把结束标签给减掉了
  
  
 截取字符串片段 excerpt(text, phrase [,option])
 参数 
 text  截取对象
 字符串
 phrase 截取的字符串
 option 动作选项
 option 
 radius 截取的前后范围
 omission 截取时候前后附加的字符串
 注:再长也会保留截取字符串
  
  
  
  
  
  
 表格和列表隔n行换色 cycle(value [,...] [,name:cname])
 一般用在each代码块下
 例style="background-color:<%= cycle'red', '#FFff99'%>;
 value  颜色值
 '#121212', 'red"
 name:cname cycle的名字
 用于识别

 其他颜色相关
 获取当前颜色循环 current_cycle([cname='default'])
 重置现在循环 reset_cycle([name = 'default])
  
  
  
 高亮文字 highlight(text, phrase [,highlighter: replaced])
 
 text 处理对象 
 phrase 关键词
 可以用数组指定一堆
 highlighter: replaced '替换的标签'
 '<h1></h1>'
\1: 搜索到的关键词,占位符
  
  
 代码块内进行输出 <% =  ... %>输出最后一个数据
 <%  ... %>中想要输出的话
 <%  
concat ...
...
concat ...
  %>
 尽量少用
 html字符转义  把危险字符转化成安全字符
< <<br>  >>
 & &
 Rails 2及之前版本 h(exp)
 Ruby 3之后不需要
 所有输出自动转义 
 
 不转义直接输出  <%== exp %>
  raw(exp)
  exp: 返回值的式子等
  
  
 
 字符串中除去要素 sanitize(html [,opts])
 
 参数 
 html  html字符串
 opts 指定保留的标签和要素
  不指定则使用默认
 tags: ["p", "h1"]
 attributes: ["id", "class", "href", "style"]
 无视设置永远除去JavaScript:(
  
  
  
  
 字符串修整
 不是视图助手,是Ruby语法
 sprintf(format, obj [,...])
 参数 
 format 形式
 obj 填充的字符
 %c  字符
 %s  字符串
 %p  p()的格式
 %b, %B  2进制
 %o  8进制
 %d, %i  10进制
 %x, %X  16进制
 %f  浮点数
 %e  浮点数
 科学计数法
 %%  %
 + 带正负号
 - 负数带负号
 0 右对齐(d)
 %[旗][长度][.精度] 旗: 0, +, -
 长度:生成字符串总长度(包含小数点和符号)
 精度: 小数点以下位数。整数的话和长度一样(字符串长度)
  
  
  
  
  
  
  
  
 数值处理
 number_xxxxx
P150~152
# TODO: 
 number_to_currency(num [,opt]) 转换成货币形式
 number_to_human(num [,opt])  转换成计数法
 1.xxxx*exp(10)
 number_to_human_size(num [,opt]) 以比特单位转换数值为KB, MB 
 number_to_percentage(num [,opt]) 转换成百分比 
 number_with_delimiter(num [,opt]) 增加各位符(没三位隔一下)
 number_with_precision(num [,opt]) 指定位数
  
  
  
  
 参数
 通用 
 locale  使用地点
 默认当前
10.4再写
 precision 小数点下的位数
 默认3
  number_to_percentage(num [,opt])默认2
 separator 小数点记号
 默认.
 delimiter 位的分隔符 
 默认,
 123,456,789
 number_to_percentage(num [,opt])
 number_with_precision(num [,opt]) 都默认为''空
 raise 参数无效时是否发送例外 NumberError
 默认false
 number_to_currency 
 unit 货币单位
 默认$
 format 正数形式
 默认 %u%n
 %u货币单位
 %n数值绝对值
 negative_format 复数形式
 默认-%u%n
  
  
 number_to_human 
 units 单位
 整数位: :unit, :ten, :hundred, :thousand, :million, :billion, :trillion, :quadrillion
 小数位: :deci, :centi, :mili, :micro, :nano, :pico, :femto
 默认对应当前位数
 format 输出形式
 默认 %n%u
  
  
  
 number_to_human
 number_to_human_size
 number_to_percentage
 number_with_precision
 
 significant true的话precision限制数值全体
 false的话只限定小数点以下
 默认false
 strip_insignnificant_zero 删除小数点以下的0
 默认true:
 number_to_human
 number_to_human_size
 默认false:
 number_to_percentage
 number_with_precision
  
  
  
   
  
  
  
  
  
 转换时间格式
 t.strftime(format)

 国际化用l方法
 10.4
 t.to_s()默认格式
 t.strftime(format)
 format 字符串
 %A 星期
 Sunday...
 %a 星期简称
 Sun, Mon, ... 
 %B 月
 January, ...
 %b 月简称
 Jan, Feb, ... 
 %c 

 Wed Jun 21 02:11:47 2017

 %d 日(01~31)
 %H 时    24小时制
 %I 时    12小时制
 %j 一年的第几天
 001~366
 %M 分 00~59
 %m 月 01~12
 %p 上下午 AM,PM
 %S  秒 00~60
 %U 周  星期天为起点
 %W 周 星期一为起点
 %w 星期几 0~6
 周日为0
 %X 时间
 %x 日期
 %Y 阳历日期 2017
 %y 阳历日期后两位 00~99
 %Z 时区 JST
 和电脑本地时区一致
 %z 时区 +900
 %% % 
  
  
  
  
  
  
  
  
  
  
  
  
  
  
链接类视图助手 
 生成超链接

 link_to(body, url [,html_opt])

 html_opt有多个的话套上{}

 参数 
 body 超链接的文本
 url 超链接地址(url)
 可以用文本直接写url
 或者url_for生成复杂的
 html_opt 动作选项
 html_opt 
 method 链接时候使用的http方法
 (:post, :delete, :patch, :put)
 默认get,不写就是get
 remote 用Ajax处理链接
 9.5.2
 data 独自的数据属性(
 
 confirm 点击链接后显示对话框
 disable_with 链接中时候表示的文本 
 属性名 id, class, style等 
 自定义文本样式 

<%= link_to url  do%>

    文本

<% end %>

 url写法 url_for,下一行
  
  
  
  
link_to 'sample', {controller: :hello, action: :view}, {method: :post, data: {confirm: 'is OK?'}, style: :"color: red;"}
 生成链接地址 url_for(opts)
 opts:哈希表形式的地址指定选项
 controller 视图控制器名
 action 动作(action)名
 host 主机名(覆盖现在的主机,啥意思?)
 protocol 协议名(覆盖现有的协议)
 anchor 标签名(页内跳转的id?)
 only_path 是否返回相对地址(省略协议,主机,接口)
 不指定host默认true
 trailing_slash 末尾加不加slash/
 user HTTP认证用的用户名
 password HTTP认证用的密码
  
  
  
 设定默认选项 在controller处,写法和url_for参数一样
 def default_url_options(options={})
    {controller: ... ,...}
 end
  
  
  
  
  
  
  
 条件型链接 link_to_if(condition, name [,url [,html_opt]], &block)
 link_to_unless(condition, name [,url [,html_opt]], &block)
 条件不成立时候输出纯文本
 参数
 condition
 
 条件语句 
 name  纯文本
 url 网址
 url_for
 html_opt 
method 链接时候使用的http方法
 (:post, :delete, :patch, :put)
 默认post
 remote 用Ajax处理链接
 9.5.2
 data 独自的数据属性(
 
 confirm 点击链接后显示对话框
 disable_with 链接中时候表示的文本 
 属性名 id, class, style等 
 &block 代码块 
 
  
  
  
  
  
  
  
  
  
 特殊的条件型链接 link_to_unless_current(name [, url [,html_opt]], &block)
 链接地址是当前页面时只显示文本,否则显示超链接
 用于菜单(menu)
 生成邮箱链接 mail_to(address [, name [, opt]])
 参数 
 adress 邮箱
 name 文本
 不指定的话默认邮箱名
 opt 选项,看下一行
  
  
 opt 
 subject 邮件名
 body 邮件内容
 cc 抄送人
 bcc 密送人
  
  
  
mail_to 'jyoitatsu@foxmail.com', 'contact me', {subject: '来自遥远的火星', body: %Q(这是一个网页自动邮箱测试\n请无视), cc: %q(qing97511@akane.waseda.jp)
  
  
 外部资源类视图助手
 别称 Asset助手(Asset Helper)
 暂略 javascript_include_tag, stylesheet_link_sheet
 9 session
 图象要素 image_tag(src [,opts])
 参数 
 src  图像的绝对路径或相对路径(/app/assets/images/后边的) 
 直接指定的默认在/app/assets/images/
 /开头的默认在/public/下
 opt 下一行
  
  
  
 opt 
 alt 无法显示时候显示的文字
 省略的话自动当做去除文件后缀的字符
 size 图象尺寸
 字符串,
 宽 x 高,'100x100'
 或者width,height分别指定
 weight 宽
 height 高
 属性 其他,如class等
  
  
  
  
  
  
  
  
  
  
  
 音频视频要素 audio_tag(src [,opts])
 video_tag(src [,opts])
 src 图像的绝对路径

 相对路径
       直接指定的默认在/app/assets/audios/
                              /app/assets/videos/
 '/'开头的默认在/public/下
opt  注:为了保证选项可用,放在/public/下
 通用 autoplay 是否自动播放
 默认false
 controls 是否表示控制狂
 默认true
 loop 是否循环播放
 默认false
 video_tag autobuffer 是否自定缓存下载
 size 尺寸
 宽 x 高,'100x100'
 width 宽
 height 高
 poster 视频可播放前显示的图象
 这个给的是路径
  
  
 自动发现域 auto_discovery_link_tag
 ???
 p164
 设置网页图标(favicon) favicon_link_tag([src [,opt]])
 src 地址
 相对地址 直接指定的在/app/assets/images
 '/'开头的在/public/
 绝对地址 不推荐
 opt  给<link>的属性
 获取外部资源的路径 
 stylesheet_path(src)
 audio_path(src)
 video_path(src)
 image_path(src)

 也有_url,path返回相对路径,url返回绝对路径
 位置: /app/assets/.../
  
  
  
  
  
 其他视图助手
 展现数据
 debug用
 debug(obj)
 或者inspect方法
 obj: 输出的对象(object)
 用来查看model的对象是否成功传递等
 debug(@test)
 @test.inspect
 capture @var = capture do
    ...template...
 end
 用途 展现一些需要重复利用,有没到需要部分模板(partial template)的内容
 @var 保存模板的变量
 template 任意的模板(template)
  
  
 不含内容的标签 tag(name [,opts [,open = false [, escape - true]]])
一般不用,略p170
 含内容的标签 content_tag(name [, content] [,opts [,escape = true]], &block)
 name 标签名
 :p等
 content 内容
 可以用block来指定
 opts 内容的属性
 哈希
 escape 默认true
 改了容易被黑
 &block 代码块
 do {}
  
  
  
  
  
  
  
  
  
  
  
  
  
 自定义视图助手
 位置 /app/helper/xxxx_helper.rb
 rails4以前的注意 默认读取所有xxxx_helper.rb
 取消方法
 /config/application.rb
 增加一行 config.action_controller.include_all_helper = false
 检验是否有block block_given? ? capture(&block) : body
 面向全体的helper /app/helper/application_help.rb
  
  
  
  
  
  
  
  
 共同造型-layout
 位置 /app/views/layouts/
 命名规则 自带application.html.erb 没有自定义的默认用这个
 视图控制器.html.erb
 适用规则
 文件放在/app/views/layouts/内部

 视图控制器为单位 
 方法1

 默认搜索layout文件夹内的同名layout

 /app/views/layouts/视图控制器名.html.erb

 例: controller是book则为book.html.erb

class HistoryController < ApplicationController
    layout 'history' #默认使用同名的layout
    ...
end

 

 方法2

 明确指定要用的layout

 视图控制器类内部
 layout layout名
 文件放在/app/views/layouts/内部

class HistoryController < ApplicationController
    layout 'sample' #文件位置: app/views/layout/sample.html.erb
    ...
end

 

 

 ● 是整个页面的模板

 以动作(action)为单位

 render layout: ...
 文件放在/app/views/layouts/内部

class HistoryController < ApplicationController
    def search
        ...
        render layout: 'search' # 按action采用模板
    end
end

 ● 是整个页面的模板

  
  
  
 模板向layout传递变量
  向外部传递变量 provide
 模板处

 <provide :变量名, 值>

 views/.../....html.erb

 layout处

  <yield(:变量名)>

  views/layouts/....html.erb

 

 
# app/views/sample.html.erb
<% provide 'sample', "test" %>

# app/views/layouts/application.html.erb
<%= yield(:sample) | 'nothing exist' %>

  模板处    <% provide :title, '???' %>
  layout处   <title><%= yield(:title).presence || 'Railbook' %></title>
 同时运用多个内容 
 模板处

 

content_for(:name) do
    ...content... # content的内容, html.erb.
end

 ● 参数

   :name为符号(Symbol)

   content为展示的内容

 ● 判定是否存在相关内容conten_for? :name

 

 layout处 <%= yield :name >
 layout嵌套

 ● layout文件放在/app/views/layouts/内部

 ● 视图控制器的需要的方法(action)处
      

# app/controllers/...rb
def 方法名
    ...
    render layout: 子layout
end


 ● 
母layout内部召唤

# app/views/layouts/application.html.erb
...
<%= content_for?(:sample) ? yield(:sample) : yield >
...

 ● 子layout:

# app/views/layouts/child.html.erb
<% content_for :... do %>
    ...
    <%= yield %>
    ...
<% end %>

<%= render template: 'layouts/application' %>

 

 

  
  
  
  
  
  
 部分模板(partial template)
 位置 /app/views/内任意,但是推荐如下
 特定的视图控制器共有 /app/views/视图控制器名/
 app全体共有 /app/views/application/
这里看做全体的部分模板,呼出不需要相对路径
 和资源强烈相关 /app/views/资源名(复数型)
  
 命名规则 开头要有_ 
 呼出方法  render url
 render partial: url
 url

 /app/views/后面的相对路径
例子:

render partial: 'application/javascript/provideMap'

 ● 全体通用的(/app/views/application/)看做全体的部分模板,呼出不需要相对路径

    app/views/application/内部的文件夹下的还是需要自定路径

 ● 和主模板在一个文件夹的呼出时可以省略到该文件夹部分

# 主模板:  ../Sample/main.html.erb
# 子模板A: ../Sample/_sub.html.erb
render 'sub'

# 子模板B: ../Sample/SubFolder/_sub.html.erb
render 'SubFolder/sub'

   layouts文件夹内部的不可省略layouts文件夹名 

 partial 哈希,符号(Symbol)可省略
  
  
  
 呼出时候传递变量

 主模板处呼出

render partial: url, locals: { var: val [, ...] } 
#
render url, var: var, ...

 

 部分模板(partial template)处接收:  val = 代替的量if val.blank? 

 注意:

 ● 传递参数只能用在呼出部分模板(_开头的文件)

 ● 主模板直接获取controller的值

 ● 用locals: {} 必须要带partial

           

主模板处呼出:
 render partial: 'view_test/partial', locals: {monst: @monst}

部分模板(partial template)处接收:
 if defined?(monst)
    unless monst.blank?
       ...
    end
 end

部分模板里面加layout  直接加里面
 p194
 呼出 render partial: '..', layout: '...', locals: {...}
 注意 partial, layout标签不能省
 要传递的参数写在loacls里面
  
  
  
 用于数组 加上conllection标签
render partial: '..', collection: '...', locals: {...}

 render partial: 'sample', conllection: @tests, locals: { ... }
 预设变量  部分模板名_iteration.index    索引
 部分模板名_iteration名.size 元素数
 部分模板名_iteration.first? 是第一个?
 部分模板名_iteration.last? 最后一个?
 可以用layout嵌套进其他模板 
 分隔 spacer_template: '用于分隔的部分模板名'
  
  
  
  
  
  
  
  
  
  
  逻辑方法
 判定

  

 current_page?(option)

 option是url_for, 或者path helper

 如果当前页是指定的url,返回true
 content_for?  判断是否存在指定的content
  
  
  
  
  
  
  
  

 

  

 

转载于:https://www.cnblogs.com/lancgg/p/8281825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值