Rails组件逐个数:Rails Form helpers

其实按归属嚟讲、呢个插件应该属于ActionView入边只控件

呢个插件其实就係负责View入边只Form标签嘅所有方法、点解Form唔响View果度讲晒佢、因为

传统嘅html页面、负责用户数据交互其实就係基于Form形式嘅、所以单独嚟讲呢件嘢、非常之重要嘅一件嘢嚟噶

依家首先讲讲佢嘅最简写法、

<%= form_tag do %>  
Form contents
<% end %>

不带任何参数、相当之简洁、迩将佢放响任何View模版页都会成效、会转化成

<form accept-charset="UTF-8" action="/en/products" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="&#x2713;"/>
<input name="authenticity_token" type="hidden" value="4ihHZIXcTSfP9soDHyo3sfOojTy4VNzUobzCSvPqBTs="/>
</div>
Form contents
</form>

当然对于莪地嚟讲、只会响浏览器过度睇到Form contents呢几个字母、但实际上、、Rails已经为莪地渲染成佐以上嘅代码、

其中嘅div係隐匿嘅、唔会显示任何嘢、但冇佐佢却係不会令rails服务器产生回应、所以佢地係非常之重要的、

第一个input指定佐成只form只能使用utf8嘅编码嚟解析文字、无论係post方法或者get方法、

而第二个input则是指定佐一种加密嘅方式、其中"authenticity_token"係指定rails援用这种"cross-site request forgery protection"加密方式、

OK简单咁就介绍到呢度、

跟住莪地就讲下常见嘅搜索框架、无非就係由一个带get方法嘅form、入边有只label标签、写住搜索栏、后边跟住只形式为text嘅input标签同埋只按钮、

submit、因此莪地用到嘅rails元素就係

form_tag,

label_tag,

text_field_tag,

submit_tag

写响ERB模版页就係

1 <%= form_tag("/search", :method => "get") do %>
2 <%= label_tag(:q, "Search for:") %>
3 <%= text_field_tag(:q) %>
4 <%= submit_tag("Search") %>
5 <% end %>

转化成嘅代码

<form accept-charset="UTF-8" action="/search" method="get">
  <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"/></div>
  <label for="q">Search for:</label>
  <input id="q" name="q" type="text"/>
  <input name="commit" type="submit" value="Search"/>
</form>

 ok、都係非常之简单噶、就唔多讲了

如果迩嘅html知识比较差嘅话、迩会唔明只label嘅for属性係乜、迩冇误会成for係id、其实唔係、佢係一个方便用户操作嘅方法

当迩点击lable标签果度、光标就会定义到去id为q嘅元素、响呢度、即係搜索栏、OK、明白了未、唔明白自己试下删除佐只属性试下D区别

然之后莪地讲下Rails嘅view同controller之间嘅一些互动、解释下它们嘅数据交换、

当迩响form输入值或者选择radio或者checkbox、然后禁只提交只制、controller就会根据迩只_tag嘅id创建同名数组并储存着数据、

例如check_box_tag(:pet_dog)呢D就係嗌做id、跟住迩若果想摞翻只值只需要对应嘅id名写params[:id]咁就得了

form helpers写着好多方法、都係以xxx_tag嚟命名嘅

下边再讲下form嘅主元素checkbox同埋radio、变换成rails嘅help方法便是

check_box_tag,

radio_button_tag

checkbox:

<%= check_box_tag(:pet_dog) %>
<%= label_tag(:pet_dog, "I own a dog") %>
<%= check_box_tag(:pet_cat) %>
<%= label_tag(:pet_cat, "I own a cat") %>

 渲染后就係

<input id="pet_dog" name="pet_dog" type="checkbox" value="1" />
<label for="pet_dog">I own a dog</label>
<input id="pet_cat" name="pet_cat" type="checkbox" value="1" />
<label for="pet_cat">I own a cat</label>

当然入边只参数就非常简单了、就係对应嘅id同埋name标签

跟住係radiobutton

<%= radio_button_tag(:age, "child") %>
<%= label_tag(:age_child, "I am younger than 21") %>
<%= radio_button_tag(:age, "adult") %>
<%= label_tag(:age_adult, "I'm over 21") %>

渲染成HTML就係

<input id="age_child" name="age" type="radio" value="child" />
<label for="age_child">I am younger than 21</label>
<input id="age_adult" name="age" type="radio" value="adult" />
<label for="age_adult">I'm over 21</label>

 同checkbox唔同嘅係佢指定着value只值、同埋id同name生成嘅方式、radio生成id係由第一个参数同都二个参数之间接着下划线组成嘅

而name则係直接由第一个参数生成嘅、因为name响表格form入边具有特性、相同name嘅radio将会作为同一个组看待、就係讲、相同

name属性嘅radio、只能有一个radio被选中、这就係radiobutton需要两个参数嘅原因了

仲有其它Dhelper嘅、

<%= text_area_tag(:message, "Hi, nice site", :size => "24x6") %>
<%= password_field_tag(:password) %>
<%= hidden_field_tag(:parent_id, "5") %>
<%= search_field(:user, :name) %>
<%= telephone_field(:user, :phone) %>
<%= url_field(:user, :homepage) %>
<%= email_field(:user, :address) %>

 渲染成html

<textarea cols="24" id="message" name="message" rows="6">Hi, nice site</textarea>
<input id="password" name="password" type="password" />
<input id="parent_id" name="parent_id" type="hidden" value="5" />
<input id="user_name" name="user[name]" size="30" type="search" />
<input id="user_phone" name="user[phone]" size="30" type="tel" />
<input id="user_homepage" name="user[homepage]" size="30" type="url" />
<input id="user_address" name="user[address]" size="30" type="email" />

注意啦!!type为search、url、email呢D迩可能好奇怪、其实呢D类型係html5标签、需要最新嘅浏览器支持(其实都唔使最新啦、基本上2010年中下旬以后嘅浏览器都支持)、 若果

迩嘅用户好不幸係国内嘅万年IE6一族嘅话、莪地可以提供以下嘅解决方案 Modernizr 同埋yepnope、呢D插件係用JS同CSS嘅方式嚟实现以上标签嘅作用、亦就係外挂式嘅html5、番鬼

佬称为HTML5 polyfill、至于点做迩就细细研究了、其实html5浏览器亦越嚟越普及了、呢D工具迟早会没落、哈哈~~~

提下text_area_tag嘅属性:size => "24*6"、其实就係cols="24" rows = "6"嘅简化写法、非常之方便!

而从search_field到email_field係一组嘅、由:user属性嚟定义、所以由此产生嘅name係user[xxx]咁嘅值、、

原文地址:https://www.cnblogs.com/klobohyz/p/2240834.html