Agile Web Developmt with Rails 翻譯(五十二)
當(dāng)用戶提交表單時,原始的POSenT數(shù)據(jù)被發(fā)送回我們的應(yīng)用程序。
當(dāng)用戶提交表單時,原始的POST數(shù)據(jù)被發(fā)送回我們的應(yīng)用程序。Rails從表單中抽取字段并構(gòu)造params哈希表。簡單地values(如,由“路由器”從form“動作”中抽取的id字段。)按層次被存儲在哈希表中。如果參數(shù)的名字被花括號括住,則Rails假設(shè)它是另一個結(jié)構(gòu)化數(shù)據(jù)的一部分,并且構(gòu)造一個哈希表來保持這個values。在這個哈希表內(nèi)部,花括號內(nèi)的字符串被用做key鍵。如果參數(shù)的名字有多個花括號則重復(fù)這個處理。
最后,“模型”對象可以從哈希表中接受新的屬性值,這允許我們這樣寫 user.update_attributes(params[:user]) Rails會綜合這些??纯磮D17.2內(nèi)的.rhtml文件,你會看到“模板”使用了一組“幫助方法”來創(chuàng)建表單的HTML,如form_tag()和text_field()方法。讓我們再看看這些“幫助方法”。
Form Helpers “模板”內(nèi)的HTML表單應(yīng)該由form_tag()開始,用end_form_tag()結(jié)束。傳遞給form_tag()的第一個參數(shù)是哈希表,它用于在表單被提交時確定被調(diào)用的“動作”。這個哈希表接受與url_for()同樣的選項(見289頁)??蛇x的第二個參數(shù)是另一個哈希表,讓你設(shè)置HTML表單標(biāo)記本身的屬性,做為一個特例,如果這個哈希表包含:multipart => true,表單將返回multipart表單數(shù)據(jù),允許它被用于文件的上傳(見350頁17.8節(jié))。 <%= form_tag { :action => :save }, { :class => "compact" } %> end_form_tag( ) 不接受參數(shù)。
Field Helpers Rails提供了完整的“幫助方法”來支持text字段(通常是,hidden,password,和text 區(qū)域),radio按鈕,和checkbox。(它也支持帶有type=”file”的<input>標(biāo)記,但我們在350頁的17.8節(jié)討論這些。)
---------------------------------------------------------------- Forms Containing Collections 如果你需要在一個表單上編輯來自同一“模型”的多個對象,把你傳遞給form“幫助方法”的實例變量的名字用花括號括起來。這會告訴Rails來包括對象的id做為字段名字的一部分。例如,下面“模板”可讓一個用戶選擇一個或多個與產(chǎn)品列表相關(guān)的imageURL。 <%= start_form_tag %> <% for @product in @products %> <%= text_field("product[]", ‘image_url‘) %><br /> <% end %> <%= submit_tag %> <%= end_form_tag %> 當(dāng)表單被提交給“控制器”時,params[:product]將是個含有哈希表的哈希表,它的每個鍵都是“模型”對象的id,并且相關(guān)的value是來自用于那個對象的表單的值。在“控制器”內(nèi),這會被用于更新所有像這樣的產(chǎn)品行 Product.update(params[:product].keys, params[:product].values) ----------------------------------------------------- 所有“幫助方法”至少接受兩個參數(shù)。第一個是實例變量(典型是個“模型”對象)的名字。第二個參數(shù)命名在設(shè)置字段值時,被查詢的實例變量的屬性。這兩個參數(shù)也一起生成HTML標(biāo)記的名字。參數(shù)即可是字符串也可以是符號;習(xí)慣上Rails使用符號。 所有“幫助方法”也接受一個可選的哈希表,典型地被用于設(shè)置HTML的class。這通常是可選的第三個參數(shù),對于radio按鈕,它是第四個參數(shù)。However, keep reading before you go off designing a complicated scheme for using classes and CSS to flag invalid fields. As we’ll see later, Rails makes that easy.
Text Fields text_field(:variable, :attribute, options) hidden_field(:variable, :attribute, options) password_field(:variable, :attribute, options) 分別為text, hidden, 或 password類型構(gòu)造一個 <input> 標(biāo)記。缺省內(nèi)容將取自@variable.attribute。通常的選項包括:size => "nn" 和 :maxsize => "nn"。
Text Areas text_area(:variable, :attribute, options) 構(gòu)造一個兩維text區(qū)域(使用<taxtarea>標(biāo)記)。通常的選項包括: :cols => "nn" 和 :rows => "nn"。
Radio Buttons radio_button(:variable, :attribute, tag_value, options) 創(chuàng)建一個radio按鈕。通常對每個給出屬性都有多個radio按鈕,每個都帶有不同的標(biāo)記值。在按鈕被顯示時,被選擇的當(dāng)前屬性的值會有一個匹配這些標(biāo)記值中的一個。如果用戶選擇了一個不同的radio按鈕,它的標(biāo)記值將被存儲在字段中。
Checkboxes check_box(:variable, :attribute, options, on_value, off_value) 創(chuàng)建一個與給定屬性密切相關(guān)的checkbox。如果屬性值為true,它將被檢查或者是在屬性值在被轉(zhuǎn)換成一個非零的整數(shù)時。 隨后返回給應(yīng)用程序的值被用來設(shè)置第四個和第五個參數(shù)。如果checkbox被檢查,則設(shè)置屬性的缺省值為“1”,否則為“0”。
Selection Lists Selection lists are those drop-down list boxes with the built-in artificial intelligence that guarantees the choice you want can be reached only by scrolling past everyone else’s choice. Selection lists 包含一個選項集。每個選項有一個顯示字符串和一個可選的value屬性。顯示字符串用戶可見,value屬性在選項被選擇后會被發(fā)送回應(yīng)用程序。對于通常的Selection lists,有個選項可能已被標(biāo)記為選擇;缺省地它的顯示字符串被顯示給用戶。對于multiselect lists,可以有多于一個選項被選擇,在這種情況下,它們的所有value都會被發(fā)送給應(yīng)用程序。 基本的 selection list 使用select()“幫助方法”創(chuàng)建。 select(:variable, :attribute, choices, options, html_options) choices參數(shù)組裝selection list。此參數(shù)可以是任何可枚舉對象(如,數(shù)組,哈希表,數(shù)組庫查詢的結(jié)果集都是可接受的)。 choices的最簡單形式是一個字符串?dāng)?shù)組。每個字符串都成為下拉列表內(nèi)的一個選項,并且如果它們中的一個若匹配當(dāng)前@variable.attribute值,它將被選擇(這些例子假設(shè)@user.name被設(shè)置為Dave。) <%= select(:user, :name, %w{ Andy Bert Chas Dave Eric Fred }) %> 這會產(chǎn)生下面的HTML。 <select id="user_name" name="user[name]"> <option value="Andy">Andy</option> <option value="Bert">Bert</option>
|
|