2013-01-09 46 views
2

我已經創建了一個資源。Rails 3表單操作和方法

resources :dashboards 

我有一個包含表單中的部分文件,我想用這個部分(如表單元素不會改變)來更新和創造。因此,這裏是我:

控制器

class DashboardsController < ApplicationController 
def new  
    @dashboard = Dashboard.new 
    end 
end 

查看

/dashboards/new.html.erb

<%= render :partial => "form", :locals => { :dashboard => @dashboard } %> 

部分形式,

/dashboards/_form.html.erb

<%= form_for(@dashboard) do |form| %> 
..... 
<% end %> 

紅寶石指南

紅寶石指南指出:

Article模型是直接提供給應用程序的用戶,所以 - 繼使用Rails進行開發的最佳實踐 - 您應該將其聲明爲資源。在處理RESTful資源時,如果依靠記錄標識,對form_for的調用可以變得更加容易。 簡而言之,您只需傳遞模型實例並讓Rails找出模型名稱和其餘部分。例如:

## Creating a new article 
# long-style: 
form_for(@article, :url => articles_path) 
# same thing, short-style (record identification gets used): 
form_for(@article) 

## Editing an existing article 
# long-style: 
form_for(@article, :url => article_path(@article), :html => { :method => "put" }) 
# short-style: 
form_for(@article) 

結果

我以爲我已經正確執行了Rails的指南。因爲我讓@dashboard成爲資源。我可以將它傳遞給表單並讓它處理動作,方法和其他。相反,我得到這個:

<form accept-charset="UTF-8" action="/dashboards" class="new_dashboard" id="new_dashboard_" method="post"> 

根據文檔。現在我的表單的動作不應該是「/ dashboards/new」,因爲我們正在採取新的行動?如果在/ edit動作中使用相同的代碼,它應該傳遞一個額外的域來聲明要放置的方法?

無論結果如何,我的結果都是一樣的。表單從不改變。

我在做什麼錯?

編輯

這裏是rake routes

GET /dashboards(.:format)   dashboards#index 
POST /dashboards(.:format)   dashboards#create 
GET /dashboards/new(.:format)  dashboards#new 
GET /dashboards/:id/edit(.:format) dashboards#edit 
GET /dashboards/:id(.:format)  dashboards#show 
PUT /dashboards/:id(.:format)  dashboards#update 
DELETE /dashboards/:id(.:format)  dashboards#destroy 
+0

好吧,我得到了形式的行動改變到當前的控制器。我在'form_for'中傳遞'@ dashboard'而不是':dashboard'。但是現在,當我在控制器中的新動作時,表單動作不應該是/ dashboards/create not/dashboards/new? –

+0

而且該方法沒有像表格那樣設置,如果我通過轉到/ dashboard /:/編輯 –

+0

進行了更新,那麼將它更改爲':dashboard',那麼您將切換到使用[表單標籤助手](http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html)而不是(資源導向)[表單助手](http://api.rubyonrails.org/classes /ActionView/Helpers/FormHelper.html)。區別是混亂,看到這個答案更多關於兩者之間的區別:http://stackoverflow.com/questions/13537700/textarea-in-rails-form#13537848 –

回答

1

你是正確的,你應該能夠「通過@dashboard到窗體,並將它處理的動作,方法和我的路由器信息休息。」這裏的問題是new在RESTful操作的上下文中。

在聲明一組資源與resources :dashboards,要創建一組請求映射到控制器動作路線:

GET  /dashboards    index 
GET  /dashboards/new   new 
POST /dashboards    create 
GET  /dashboards/:id   show 
GET  /dashboards/:id/edit edit 
PUT  /dashboards/:id   update 
DELETE /dashboards/:id   destroy 

您可以檢查這一點,如果你運行rake routes

的這裏的問題是,new動作被定義爲GET請求到路徑/dashboards/new,即這是表單本身路由。實際表格的action屬性中的URL是其他內容:這是表單將數據發送到POST請求的位置,服務器(導軌)端將映射到create控制器操作。

當您使用表單助手form_for(dashboard)時,會創建一個表單,其路徑對應於dashboard所對應的路徑:如果它是新記錄(即它尚不存在於數據庫中),則表單動作將爲create(並指向/dashboards),而如果它已經存在,它將指向記錄的實際URL(例如/dashboards/123)。這正是表單助手如此有用的原因。

所以,綜上所述,/dashboards是正確的網址,而不是爲new行動,但爲create行動,其形式助手使用,因爲dashboard是一個新的記錄。 new是表單所在頁面的路徑,即/dashboards/new

希望是有道理的。

p.s.作爲一個方面說明,如果您以本地方式(:locals => { :dashboard => @dashboard })傳遞它,則不應該在部分中訪問@dashboard。只需使用dashboard

+0

Hi @shioyama感謝您的快速回答。現在,當我查看http:// localhost:3000/dashboards/new時,表單操作不是'/ dashboards/new',而是'/ dashboards'。將表單發佈到/ dashboards/new顯然不起作用。我在上面的帖子編輯中放置了我的路線信息。 –

+0

你有什麼改變嗎?原來它是'/ dashboards',這是正確的。你應該有'form_for(儀表板)',而不是'form_for(:儀表板)'。 –