Rails 曾经迷惑的小知识一

以下都是参考自:Ruby on Rails 实战圣经,里面有很多好用的小知识,也是曾经走过的坑,一点点知道的,这里面给整理的很好。已经一字不差的读到 Part 2 第 10 个了,接下来继续。因为都是地铁上看的,所以,就今天摘了一些我曾经迷惑过的小知识下来。

  1. <%- -%> 有什么作用?
<% @people.each do |person| %>
  <% if person.name.present? %>
    <p><%= person.name %></p>
  <% end %>
<% end %>

上述的 <% %> 标签虽然不会输出 HTML 內容,但是还是在 HTML 原始码中换行了,为了避免输出時多余的換行,可以改用 <%- -%>。不过实际上并沒有很多人在乎就是了,毕竟这不影响用户的页面。

  1. 设定 layout
# Controller 设定 layout
layout "special", only: :index
layout "special", except: [:show, :edit, :new]

# Action 中设定 layout
def show
   @event = Event.find(params[:id])
    render layout: "foobar"
end
  1. Collection

如果是列表集合,像是 trli 這类会一直重复的 Template 元素,我们可以使用collection 参数來处理,例如像以下的程式:

<ul>
    <% @people.each do |person| %>
        <%= render :partial => "person", :locals => { :person => person } %>
    <% end %>
<ul>

我們可以改写成使用 collection 参数來支援列表集合:

<ul>
    <%= render :partial => "person", :collection => @people, :as => :person %>
<ul>

_person.html.erb 這個 partial 中,会有有一个额外的索引变量 person_counter 记录编号。

使用 collection 的好处不只是少打字而已,还有执行效能上的大大改善,Rails 內部会针对这种形式做执行效率最佳化。

  1. Helper
    因为 Helper 预设只能在 Template 中使用,如果想在 rails console 中呼叫,必须加上 helper,例如 helper.link_to。另外,虽然机会不多,如果真的要在Rails Controller或Model程式中呼叫Helper,则可以加上ApplicationController.helpers前置词

Helper是全域的,定义在哪一个档案中没有关系,档案名称也不需要与Controller名称对应。

  1. 静态档案辅助方法
    使用 Rails 内建的静态档案(Assets)辅助方法有几个好处:

Rails 会合并 StylesheetJavasSript 档案,可以加速浏览器的下载。
Rails 会编译 SassCoffeeScript 等透过 Assets template engine 产生的 StylesheetJavasSript
Rails 会在静态档案网址中加上时间序号,如果内容有修改则会重新产生。这样的好处是强迫用户的浏览器一定会下载到最新的版本,而不会有浏览器快取到旧版本的问题。
变更 Assets host 主机位址时,可以一次搞定,例如上 CDN 时。透过 HelpersRails 可以帮所有的 Assets 加上静态档案伺服器网址。
几个常用的方法:

javascript_include_tag
stylesheet_link_tag
auto_discovery_link_tag
favicon_link_tag
image_tag
video_tag
audio_tag
  1. 格式化辅助方法
    simple_format
    \n换行字元换成HTML的<br>标签。在表单输入的<textarea></textarea>中,换行其实是\n控制字元,因此输出在网页上时,\n代表的是在HTML原始码中换行,因此我们经常需要将\n再换成<br>标签,这样浏览器看到的画面才有换行的呈现。
<%= simple_format("foo\nbar") %>
# 輸出 "<p>foo\n<br />bar</p>"

truncate 截取前几个字符

<%= truncate("Once upon a time in a world far far away") %>
# 輸出 "Once upon a time in a world..."

<%= truncate("Once upon a time in a world far far away", length: 17) %>
# 輸出 "Once upon a ti..."

strip_tags
移除HTML标签

strip_links
移除HTML超连结标签

distance_of_time_in_words
输出很酷的时间距离,例如

distance_of_time_in_words(Time.now, Time.now + 60.minutes)
=> "about 1 hour"
distance_of_time_in_words_to_now
distance_of_time_in_words_to_now(Time.now - 1.second)
=> "less than a minute"

time_tag
输出HTML5时间标签

time_tag(Time.now)
=> "<time datetime=\"2014-11-03T23:55:11+08:00\">November 03, 2014 23:55</time>"

number_with_delimiter

number_with_delimiter(1234567)
=> "1,234,567"
number_with_precision
number_with_precision(123.4567, precision: 2)
=> "123.46"
  1. URL辅助方法
    link_to 文字超连结
    除了学过的 <%= link_to '超連結文字', xxx_path %> 用法之外,如果超连结文字很多甚至有图片,可以用 block 的方式改写,例如:
<%= link_to user_path(user) do %>
  <%= image_tag user.avatar.url %> <%= user.display_name %>
<% end %>

mail_to E-mail
button_to 按钮连结,这个预设会改用POST出去(实际是个只有按钮的表单)。因此如果超连结有用 method: :post 等非GET方法时,建议可以考虑改用 button_to而不是 link_to,这样在JavaScript失效的情况下仍然可以作用,满足网页无障碍的标准。
current_page?(url) 是否目前是url这个页面,通常是在 layout 上搭配 tab 样式做 active 效果

  1. 表单辅助方法
    select
    使用 select 有一个坑:如果你要加 class 的话,必须这样写 f.select :xxx, {}, :class => "your-class-name",多出来的{}是因为这个select API的最后两个参数都是Hash,必须多包一个{}才能让 :class 挤到最后的参数去。

搭配model用的f.check_box :column_name和check_box_tag :input_name有微妙的差异,前者会多产生一个隐藏的hidden_field :column_name, "0"来表示没有勾选的状态,后者则不会。这是因为如果你没有勾选的话,浏览器就不会送出check_box的资料,因此Rails用了一个隐藏栏位来处理反勾选。

  1. 如何处理 Model 中不存在的属性
    使用 form_for 时,其中的栏位必须是 Model 有的属性,那如果资料库没有这个栏位呢?这时候你依需要在 Model 程式中加上存取方法,例如:
class Event < ApplicationRecord

  #...
  def custom_field
      # 根據其他屬性的值或條件,來決定這個欄位的值
  end

  def custom_field=(value)
      # 根據value,來調整其他屬性的值
  end

end

这样就可以在 form_for 里使用 custom_field 了。

<%= form_for @event do |f| %>
    <%= f.text_field :custom_field %>
    <%= f.submit %>
<% end %>

记得把 :custom_field 也加到 Strong Parameters 清单里,这样按下送出后,就可以跟着 @event 本来的栏位一起处理了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345