2017-05-07 113 views
0

我正在創建一個名爲User的腳手架。我查了局部視圖「_form」的代碼,我看到下面的代碼片段:當點擊提交按鈕時,form_for如何知道要去哪個URL /路徑?

<%= form_for(user) do |f| %> 
    <div class=field> 
     <%= f.label :firstname %> 
     <%= f.text_field :firstname %> 
    </div> 
    <div class="actions"> 
     <%= f.submit %> 
    </div> 
<% end %> 

所以,如果你點擊通過上面的代碼生成的提交按鈕,如何軌知道,因爲去的地方網址/路徑它沒有詳細說明尋找什麼路徑?

+0

小_rails magic_,閱讀它[這裏](http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object)。 – Gerry

+0

[rails是否使用方法:: patch用於修改\ _form.html.erb?](http://stackoverflow.com/questions/43795769/does-rails-use-method-patch-for-editing- with-form-html-erb) –

回答

2

除了Amr El Bakry's answer之外,讓我幫你揭開form_for輔助方法背後的Rails魔法。

所以你的問題基本上是:form_for如何找出提交路徑,以及它如何區分創建/更新記錄?

Rails實際上通過record identification對此進行分類。一個例子是值得在這一點上:

## Creating a new user 
# long style 
form_for(@user, url: users_path) 
# short style - record identification gets used 
form_for(@user) 

## Updating an existing user 
# long style 
form_for(@user, url: user_path(@user), html: { method: "patch" }) 
# short style - record identification to the rescue 
form_for(@user) 

你可以清楚地看到,短花柱是這兩種情況的相同。 記錄標識足夠聰明,可以通過調用@user.persisted?找出記錄是新的還是現有的

你可能有興趣對line 462斷言自己這個事實在form_for定義form_helper.rb裏面!

希望它有幫助!

2

在您的config/routes.rb文件中,當您生成腳手架時,您會發現Rails添加了resources :users。這被稱爲足智多謀的路線,它會爲您的user資源創建七條不同的路線;每個路由將HTTP動詞和URL映射到控制器操作。

在你的情況下,當你提交表單中,HTTP動詞是POST,路徑是/users映射到users控制器內部的create行動。這是Rails的默認設置,你可以在Rails Guides on Routing中看到它的全部內容。

+0

ok,因此它在由控制器的資源路由創建的路由中查找具有POST HTTP謂詞的模式?因此,例如,如果我有兩個足智多謀的路線: 資源:用戶 和 資源:帖子 如果窗體視圖是從用戶創建的,那麼它將只查找具有POST動詞的路由資源:用戶路由? 那麼編輯?它如何知道該表單是用於創建新記錄還是僅編輯記錄? – Lou

+0

它會查找與路由文件中HTTP動詞和URL'/ users'的第一個匹配項。 @Wasif Hossain詳細闡述了這一點以及它如何知道何時編輯。 – amrrbakry