2015年3月26日 星期四

Ruby on Rails:form_for 與 simple_form,下拉式清單

在ruby on rails中要顯示表單可以使用內建的form_for或是Plataformatec開發的simple_form,以下以form_for和simple_form顯示相同的表單欄位,讓大家看看2個不同的地方



form_for
以下這段是以scaffold自動建立的_form.html.erb,只修改label顯示的字與幫submit button套上bootstrap

<%= form_for(@invite) do |f| %>
  <% if @invite.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@invite.errors.count, "error") %> prohibited this invite from being saved:</h2>

      <ul>
      <% @invite.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name ,"姓名/暱稱 *"%><br>
    <%= f.text_field :name %>
  </div>
  <br>
  <div class="field">
    <%= f.label :email,"Email *" %><br>
    <%= f.text_field :email %>
  </div>
  <br>
  <div class="field">
   <%= f.label :event ,"活動 *"%><br>
   <%= f.collection_select(:event_id, Event.all, :id, :title) %>
  </div>
  <br>
  <div class="actions">
    <%= f.submit "確認送出" , class:"btn btn-success btn-lg"%>
  </div>
<% end %>

正常顯示:
觸發validates的狀態

simple_form
simple_form安裝&簡介:simple_form github

<%= simple_form_for(@invite) do |f| %>

  <div class="field">
    <%= f.input :name, label:'姓名/暱稱' %>
  </div>
  <br>
  <div class="field">
    <%= f.input :email, label:'Email' %>
  </div>
  <br>
  <div class="field">
    <%= f.association :event, label:'活動' %>
  </div>
  <br>
  <div class="actions">
    <%= f.button:submit, "確認送出", class:"btn btn-success btn-lg"%>
  </div>
<% end %>

正常顯示:
觸發validates的狀態

目前覺得使用simple_form優點:

  • 語法比較簡潔
  • 版面比較好看
  • 如果欄位有加上必填的validates,會自動幫欄位加上*,提示使用者該欄位為必填
  • 如果欄位有加上validates,觸發validates時欄位會變紅,非常醒目的提醒使用者該欄位有錯誤,且錯誤訊息直接顯示在欄位下方


下拉式清單製作:
先簡述一下目前的狀況,申請頁使用的資料表是invites,活動的欄位想要使用下拉式清單讓使用者選擇
  • 新建一個event model或是使用scaffold再建立一個event資料表
  • 幫events資料表新增一些資料
  • 將invites資料表新增一個event_id欄位
  • 將events和invites加上關聯,在event.rb加上「has_many:invites」,在invite.rb加上「belongs_to:event」(關於資料表關聯請參考我的這篇文章:Ruby on Rails 資料表一對多、多對多關聯)
  • 接下來看你在_form.html.erb中是使用form_for還是simple_for,加入對應的下拉式清單
    form_form「<%= f.collection_select(:event_id, Event.all, :id, :title) %>」
    simple_form「<%= f.association :event, label:'活動' %>」