2009-10-21 16 views
0

提交表單以創建新對象時,我會在提交表單時收到錯誤消息。當我使用相同的表單,但隨後與一個實例變量似乎一切正常,任何線索爲什麼使用:符號提交失敗?form_for using:symbol not working,error [只允許獲取,放入和刪除請求]

錯誤消息說:只允許獲取,放入和刪除請求。

形式的代碼:符號:

<% form_for :ecard do |f| %> 
    <%= label(:ecard, :title) %><br/> 
    <%= f.text_field :title, :tabindex => "1" %> 
    <%= f.submit "Create Ecard" %> 
<% end %> 

的形式去確定當我使用

<% form_for @ecard do |f| %> 
    <%= label(:ecard, :title) %><br/> 
    <%= f.text_field :title, :tabindex => "1" %> 
    <%= f.submit "Create Ecard" %> 
<% end %> 

一些代碼我的控制器的:

# GET new_ecard_url 
# return an HTML form for describing the new ecard 
def new 
    @ecard = Ecard.new 
end 

# POST ecard_url 
def create 
    # create an ecard 
    @ecard = Ecard.new(params[:ecard]) 
    if @ecard.save 
     flash[:notice] = "Succesfully created a new Ecard" 
     redirect_to :action => 'index' 
    else 
     flash[:warning] = "Error when saving Ecard" 
     render :action => 'new' 
    end 
end 

回答

0

的一個好辦法舉幾個例子,看看發生了什麼事情是使用Firebug,檢查生成的HTML。如果你沒有Firebug,現在就拿它,這真的非常寶貴。

如果您使用實例變量創建表單,你會得到的線沿線的東西:

<form id="new_ecard" class="new_ecard" method="post" action="/ecards"> 

因此,這將創建一個POST請求/ecards行動,這是創建方法(通過在創建方法上方,您的評論應該是POST ecards_url,而不是ecard_url,除非您另有定義)。

但是如果你只使用:ecard符號,而不是實例變量,你會得到:

<form method="post" action="/ecards/new"> 

既然你沒有指定一個URL,它採用了當前之一。這意味着您的表單將在這種情況下自行調用,而且什麼都不會發生。

所有這一切都是由於所有所謂的魔術Rails所做的 - 約定優於配置。但是,正如Danivo所說的,如果你不想讓這種奇蹟發生,你可以手動指定URL並明確聲明表單的每個參數。

+0

事情正在爲我清除:)我被使用只有:卡符號的教程弄糊塗了,而且我實際上很想知道爲什麼這對我沒有用。所以建議是使用普通的實例變量而不是符號表示法。當我堅持自己的約定,這是一件事情是肯定要做:) – Marco 2009-10-21 13:38:25

1

如果第一個參數是一個符號,它將描述窗體所關注的對象並命名實例變量,然後您需要提供URL。

可以使用實際的對象,然後它將使用您的路線來嘗試並確定URL。這意味着它必須知道new_ecard_pathedit_ecard_path
它會查看該對象並查看它是否是新記錄以確定使用哪個記錄。

如果您使用具有默認安靜路由的資源路由,那麼您可能只需使用實例對象。如果您需要指定表單所使用的網址,請使用符號並指定網址。

有在http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

+0

所以使用<%form_for:ecard do | f | %>實際上是不完整的,因爲我閱讀你的回覆? – Marco 2009-10-21 13:09:06

相關問題