3.3. Forms

上节我们学习了如何使用link helper 生成链接来从服务器端请求信息,但是在许多情况下,我们需要给服务器发送数据,这就是表单的作用了。首先,我们创建一个没有 Ajax 的表单。利用 form_tag helper 创建一个 form 元素。
<%= form_tag :action => 'reverse' %>
生成的html代码:

     
     
     
     
< form action ="/chapter3/reverse" method ="post" > form>

    
     
    

    
     3.3.1
    . Form Tag Helpers
     
在表单中,有创建输入框的helper,下面看几个例子:
      

      
      
      
      
text_field_tag( name , value = nil , options = {} )
options选项是一个hash,用来控制HTML属性,例如:

     
     
     
     
<%= text_field_tag "name", "Scott",
     :size     => 5,
     :disabled => true,
     :style    => "background-color: red" %>
这个helper产生的HTML代码:

     
     
     
     
  size="5"
  disabled="disabled"
  style="background-color: red" />
 

     
     
     
     
hidden_field_tag(name, value=nil, options={})

    
      
    
options选项和text_field_tag的一样。
      

      
      
      
      
password_field_tag( name = "password" , value = nil , options = {} )
options选项和text_field_tag的一样。
file_field_tag( name , options = {} )
options选项和text_field_tag的一样。
      
check_box_tag( name , value = "1" , checked = false ,options = {} )
 
options选项和text_field_tag的一样。
 
radio_button_tag( name , value , checked = false , options = {} )
options选项和text_field_tag的一样。
        
text_area_tag( name , content = nil , options = {} )
options选项和text_field_tag的一样,除了:size选项用来指定高和宽,例如:
        

       
       
       
       
< %= text_area_tag "body", nil, :size = > "25x10" %>

      
        
      

        
        
        
        
select_tag( name , option_tags = nil , options = {} )
options选项和text_field_tag的一样,option_tags是一个包含选择框中选项的字符串。例如:
        

       
       
       
       
< %= select_tag "people", "Joe option>" %>
选择一些标签加入到index.rhtml视图模板中:
        

       
       
       
       
< %= form_tag :action = > 'reverse' %>
   < p >Text to reverse: < %= text_field_tag 'text_to_reverse' % > p>
   < p > < %= submit_tag 'Reverse!' % > p>
< %= end_form_tag % >
表单把数据提交到了reverse这个action, 这个action在前面已经定义过了, 但是还需要一个对应的模板。在app/views/chapter3/reverse.rhtml中加入下面的代码:

       
       
       
       
< %= @reversed_text % >
现在,刷新一下页面,在文本框中输入内容,点击提交按钮,如果一切顺利,reverse这个action会将输入文本倒序并且会在新的页面中呈现这个结果。
        

      
        3.3. Forms_第1张图片
      

      

        
        
 3.3. Forms_第2张图片
       

          
         

       
      
      
       3.3.2
      . Form Helpers
       
Form helper 与前面讲的 form_tag helper 不同 , 它是用来构建表单,这个构建的表单是跟从 controller 中指派到模板中的 ActiveRecord 对象相联系的。假设 controller 指派了一个 @person 对象到模板中,这个对象有一个 name 属性,就可以这么来创建这个表单:
< %= text_field :person, :name % >
form_tag helper 中有 name value 这两个参数,在 form helper 中使用 object_name method 参数。其中的可用选项类型是一样的:
text_field( object_name , method , options = {} )  

hidden_field( object_name , method , options = {} )  

password_field( object_name , method , options = {} )  

file_field( object_name , options = {} )  

check_box( object_name , method , options = {} , checked_value = "1" , unchecked_value = "0" )  

radio_button( object_name , method , tag_value , options = {} )  

text_area( object_name , method , options = {} )  

3.3.2 .1. Using form_for
当你创建与 ActiveRecord 对象一起工作的表单时,还有另外一个功能强大的 helper form_for 。这个 helper form_tag 类似,除了它依赖于一个特定的 ActiveRecord 对象并且在 form_for block 中可以使用 form helper 来使表单代码更简洁。一般情况下,与 ActiveRecord 对象一起工作最好的选择是使用 form_for 而不是 form_tag, 这也遵循了 DRY 原则。因为 ActiveRecord 并不是本书要讲述的范围,所以这里也不再废话。你可以在 Rails API 文档中查阅有关 form_for 的更多细节。