scribble

吕小荣

Blog Friends RSS About

最干净的 select

19 November, 2013

Rails form 中的 select,怎么写才够优雅?

第一种境界

在form中,以数组的方式列出select的值


<%= simple_form_for @user do |f| %>
  <%= f.input :sex, collection: ['male','female'] %>
<% end %>  

缺点:

假如日后增加一种性别 ‘女博士’ ,需要修改相应的表单。一个表单还好办,假如有A、B、C三个表单调用,改起来不是一般的麻烦。

  1. 违反了DRY原则,
  2. 不好维护。

## 第二种境界

把性别写到 model 的常量中,在表单中调用。如果要增加一种性别,直接修改类常量。


class student
  SEX = ['Male', 'Female']
  attr_accessor :sex, :name, :age
end

<%= simple_form_for @user do |f| %>
  <%= f.input :sex, collection: Student::SEX%>
<% end %>  

这种代码看起来稍具有可读性,也便于维护,但是还不够间接。

## 第三种境界

最干净,最简洁,最容易维护


<%= simple_form_for @user do |f| %>
  <%= f.input :sex %>
<% end %> 

如果想要radio_button 的样式,可以写为


<%= simple_form_for @user do |f| %>
  <%= f.input :sex, :as => :radio_buttons %>
<% end %>

为什么不需要写 collection 呢?

因为项目里使用了enumerize这个gem来实现I18n,它恰巧可以搭配 simple_form,自动判断input的类型。