Ruby on Rails - Cool stuff & tips

Arrays: map & each_with_index

在跑陣列(array) for-each 每一個 interation 可以帶上相對應的 index,利用 each_with_index 這個方法:

['a', 'b', 'c'].each_with_index do { |item, index|
  puts "#{index}-#{item}"
}

當然,我們也可以利用 index 對應到的 element 組成一個新的 object:

['a', 'b', 'c'].each_with_index.map { |item, index|
  { :letter => item,
    :position => index }
}

View: cycle is no even odd###

在網頁設計上,常為了讓表格內容更容易被閱讀,讓表格每行的顏色交錯,像是:

正常寫法:

<% an_array.each_with_index do |element, index| %>
  <tr class="<%= index.odd? ? 'odd' : 'even' %>">
    <td>...</td>
  </tr>
<% end %>

在 Rails 有提供一個很棒的 helper 函式 cycle:

<% an_array.each do |item| %>
  <tr class="<%= cycle('odd','even') %>">
<td>...</td>
  </tr>
<% end %>

更多 cycle 用法可參考文件

try

這是 Ruby 語法中最讓我驚艷不已的一個...省掉超級多行。原先為避免對 nil 呼叫產生錯誤,會這樣寫:

if @person.present? && @person.a_property == 'foo'
  ..
end

<% if @an_array.present? %>
  <% @an_array.each do |item| %>
    ...
  <% end %>
<% end %>

學會 try 之後可以這樣寫:

if @person.try(:a_property) == 'foo'
   ...
end

<% @an_array.try(:each) do |item| %>
  ...
<% end %>