表单视图助手 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 | 对象 ● params的名字, params[A][B]的A部分 ● form_for代码块下省略 | prop | 指定对象的属性 ● params的名字, params[A][B]的B部分 | collection | 生成选项的对象 | value | 对象(collection参数)里指定为 value 的属性 ● 调用collection.value指定的方法 | text | 对象(collection参数)里指定为输出的文本的属性 ● 调用collection.text指定的方法 | 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 自动进行如下调用 | 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]) 参数 | | 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 [,...]) 参数 | | %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 '[email protected]', 'contact me', {subject: '来自遥远的火星', body: %Q(这是一个网页自动邮箱测试\n请无视), cc: %q([email protected]) |
| |
| |
外部资源类视图助手 |
别称 | 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, ' 05-29 01:24 |