form_for使用:符号不起作用,错误[仅允许获取,放置和删除请求]

时间:2009-10-21 12:28:44

标签: ruby-on-rails ruby

提交表单以创建新对象时,我在提交表单时收到错误消息。当我使用相同的形式,然后使用实例变量时,一切似乎都很好,任何线索为什么使用:符号提交失败?

错误消息显示:只允许获取,放置和删除请求。

带<符号的表单的代码为:

<% 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

2 个答案:

答案 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并明确说明表单的每个参数,如果你不想让这种魔法发生在你身上。