对网页应用程式来说,表单是非常重要的用户输入介面。Rails在这方面也提供了很多好用的Helper方法。基本上,Rails处理表单分成两种类型:
一种是对应到Model物件的新增、修改,我们会使用form_for
这个Helper。它的好处在于透过传入Model物件,可以在修改的时候自动帮你将预设值带入。例如我们已经在Part1使用过的event表单:
<%= form_for @event do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
另一种是就是没有对应Model的表单,我们使用form_tag
这个方法。例如:
<%= form_tag "/search" do %>
<%= text_field_tag :keyword %>
<%= submit_tag %>
<% end %>
和form_tag
有些类似,但是其中不需要传Block变数f
,其中的栏位Helper需要多加_tag结尾。不像form_for
的栏位名称一定要是Model的属性之一,在form_tag
之中的栏位名称则完全不受限。
几个常用的表单栏位辅助方法:
使用form_for时,其中的栏位必须是Model有的属性,那如果资料库没有这个栏位呢?这时候你依需要在Model程式中加上存取方法,例如:
class Event < ActiveRecord::Base
#... 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 %>
当Model物件储存失败时,我们通常会重新显示表单,这时候该怎么显示Model的错误讯息呢?以下是一个预设的范例:
<%= form_for(@person) do |f| %> <% if @person.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@person.errors.count, "error") %> prohibited this person from being saved:</h2>
<ul>
<% @person.errors.full_messages.each do |msg| %> <li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.text_field :name %> <%= f.submit %>
<% end %>
透过检查@person.errors
我们可以把所有的错误讯息显示出来。除了 这种作法,我们也可以把错误讯息放在输入框的旁边:
<%= form_for(@person) do |f| %>
<%= f.text_field :name %>
<% if @person.errors[:name].presence %> <%= @person.errors[:name].join(", ") %>
<% end %>
<%= f.submit %>
<% end %>
要建立自定的Helper,只需要将方法定义在app/helpers/目录下的任意档案就可以了。在产生Controller的同时,Rails就会自动产生一个同名的Helper档案,照惯例该Controller下的Template所用的Helper,就放在该档案下。如果是全站使用的Helper,则会放在app/helpers/application_helper_rb,例如:
module ApplicationHelper def gravatar_url(email)
gravatar_email = Digest::MD5.hexdigest(email.downcase)
return "http://www.gravatar.com/avatar/#{gravatar_email}?s=48"
end
end
如此便可以在Template中这样使用:
<%= image_tag gravatar_url(user.email) %>