如何理解 form for 和 form tag

2021-07-24 07:33:12 字數 2361 閱讀 4322

在我們使用rails的過程中,必然離不開form_for,甚至在剛入門沒有多長的時間裡就會接觸到form_for。本來form_for並不是乙個如何特別神奇的東西,無非就是乙個helper,helper的作用是什麼?對於helper而言,無論它的邏輯多麼的複雜,其實本質的作用就是生成html**。所以我們應該以html的角度,去理解form_for.

是用於重置表單的,可是我並不知道應該怎麼放入form_for當中!

關於這型別的問題,我已經遇到很多次了,例如說boostrap中關於一些form的樣式**,不知道如何應用到form_for中之類。 那究竟關於裡的一些事情,如何應用到form_for中呢?

先看看官方的文件怎麼介紹form_for的:

<%= form_for @article, url: , html:  do |f| %>

<%= f.text_field :title %>

<%= f.text_area :body, size: "60x12"

%>

<%= f.submit "create"

%>

<% end %>

生成如下的html:

其實如果你願意的話,上面的form_for是可以混著html寫的,當然我覺得這不會是乙個好的案例,如:

<%= form_for @article, url: , html:  do |f| %>

<%= f.text_field :title %>

id="article_body"

name="article[body]"

cols="60"

rows="12">

textarea>

<%= f.submit "create" %>

<% end %>

所以對於之前如何新增的問題來說,答案已經很清晰了。當然如何解決這個問題並不是主要想討論的事情,關鍵的一點是非常多的初學者對form_for的理解誤區,他們普遍覺得在form_for裡寫input是應該像這樣的:<%= f.text_field :title %>,而不是,關鍵是忽略了form_for主要責任是生成html而已。所以特別需要記住的一點是,就算是在rails裡,http的表單請求依然是依賴html的標籤,而不是rails的form_forhelper,而form_for是用於生成。所以這個問題的產生其實是源自於對html本身的不夠熟悉。

form_for與form_tag

好了,那說完以上的問題後,在說說那form_for和form_tag的區別是什麼?其實它們的區別就是生成的html不一樣,而有非常一大部分的初學者會認為他們的區別是乙個用於建立和更新用,對於搜尋就使用form_tag。初學者的觀點也不能說不對,但是如果要了解為什麼需要在不同的情況使用不同的helper還是需要了解一下它們的區別。那它們生成的html究竟有什麼不一樣呢?

關於form_for的例子,可以看上面提到的那個例子,而現在看看官方文件中對form_tag的描述是怎麼樣的:

<%= form_tag("/search", method: "get") do

%>

<%= label_tag(:q, "search for:") %>

<%= text_field_tag(:q) %>

<%= submit_tag("search") %>

<% end %>

生成如下的html:

它們最大的區別和最關鍵的區別就是input中的name值,分別是:form_for是name=」article[body]」,而form_tag是name=」q」,而這個name值決定了資料發往伺服器時的格式是怎麼的:form_for傳出去的格式是},而form_tag則是。關於article這個名稱的定義則**於form_for @article中的@article。

然後清楚了它們的兩個的區別後,又會衍生另乙個問題,就是,那我用form_for做搜尋不就也可以了?答案是:當然可以。但這裡會有乙個問題,如果你直接這樣使用form_for @search的話,整個頁面就會出錯了。原因在於rails並不知道@search是不是乙個hash型別,而且並沒有定義裡面的引數值,所以你這樣定義就可以順利通過了:@search = 。同理可得,其實@article = article.new就相當是乙個給予article預設key值和預設value值的過程。所以其實無論是form_for或form_tag都好,rails無形中都幫我們把整個概念整理的更簡潔了。

所以在建立和更新方面常見的操作為@article = article.new(params[:article]),而在search中則多為@article = article.search(name: params[:name])。

如何理解 和equals方法

操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用 操作符。如果乙個變數指向的資料是物件型別的,那麼,這時候涉及了兩塊記憶體,物件本身占用一塊記憶體 堆記憶體 變數也占用一塊記憶體,例如 objet ...

如何理解c 委託和事件

有很多同學在學習c 的委託和事件時,都一頭霧水,有的不理解委託和事件到底是什麼東西,有的理解了概念,但不知道在什麼場景中應該應用委託和事件,今天我們就一起總結下委託和事件的知識點 委託 我們先從字面上理解委託,就是將事情託付給別人做,而非自己親自做,自己只負責通知。巨集觀上來看,委託就是一種通知機制...

如何理解和實現c 事件

網上有很多關於事件是如何實現的,但看來看去都不是很明了。step 1 什麼是事件 究竟什麼是事件呢?想到事件,就讓我想到911.記得那段事件大家都在談911事件。什麼是911事件呢?就是飛機撞大樓這個動作導致了911事件的產生。但在c 中又如何理解呢。其實所謂事件,就是由某個物件發出的訊息,這個訊息...