rails view层的具体细节(六)

URL辅助方法

  • link_to 文字超连结
  • mail_to E-mail
  • button_to 按钮连结

自定标签辅助方法

  • tag
  • content_tag

其他辅助方法

  • escape_javascript
  • debug
  • number_to_currency

表单辅助方法

对网页应用程式来说,表单是非常重要的用户输入介面。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之中的栏位名称则完全不受限。

几个常用的表单栏位辅助方法:

  • text_field
  • text_area
  • radio
  • check_box
  • select
  • select_date, select_datetime
  • submit

如何处理Model中不存在的属性

使用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 %>

Rails 2版本中有error_messages_forerror_message_on方法,Rails 3则被移成Pluginhttp://github.com/rails/dynamic_form

自定Helper

要建立自定的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) %>

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


转自:http://ihower.tw/rails3/actionview-helpers.html

你可能感兴趣的:(rails view层的具体细节(六))