提交表单以创建新对象时,我在提交表单时收到错误消息。当我使用相同的形式,然后使用实例变量时,一切似乎都很好,任何线索为什么使用:符号提交失败?
错误消息显示:只允许获取,放置和删除请求。
带<符号的新表单的代码为:
<% form_for :ecard do |f| %>
<%= label(:ecard, :title) %><br/>
<%= f.text_field :title, :tabindex => "1" %>
<%= f.submit "Create Ecard" %>
<% end %>
当我使用
时,表单会 ok<% 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 :(得分:1)
如果第一个参数是符号,它描述表单所关注的对象并命名实例变量,然后您需要提供URL。
可以使用实际对象,然后它将使用您的路由来尝试确定URL。这意味着它必须知道 new_ecard_path 和 edit_ecard_path 。
它将查看该对象并查看它是否是一个新记录来确定要使用哪个。
如果您使用具有默认restful路由的资源路由,那么您可以只使用实例对象。如果您需要指定表单所在的URL,请使用该符号并指定URL。
http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html
有几个例子答案 1 :(得分:0)
查看正在发生的事情的好方法是使用Firebug并检查生成的HTML。如果你没有Firebug,现在就去吧,它真的非常宝贵。
如果使用实例变量创建表单,您将获得以下内容:
<form id="new_ecard" class="new_ecard" method="post" action="/ecards">
因此,这将为/ecards
操作创建一个POST请求,这是一种创建方法(顺便说一句,您在create方法上方的评论应该是POST ecards_url
,而不是ecard_url
,除非你已经另外定义了。)
但是,如果您只使用:ecard
符号而不是实例变量,那么您将获得:
<form method="post" action="/ecards/new">
由于您尚未指定URL,因此它使用当前URL。这意味着你的表格在这种情况下会自我调用,什么都不会发生。
所有这一切都归功于所有所谓的魔术Rails确实 - 约定优于配置。但正如danivo所说,你可以手动指定URL并明确说明表单的每个参数,如果你不想让这种魔法发生在你身上。