0

注意:我已经阅读了从内到外的路由和关于路由的引擎场博客文章。

我正在建立一个梦幻体育联盟,我有一个联盟模型,它支持七种基本的宁静操作,它们都运行良好。

我添加了以下我的 routes.rb

  resources :leagues do
    member do
      get :invite
      post :sendem
    end

在文件的后面,我有一个资源:用于基本操作的联盟

当我搜索路线时,我可以看到:

invite_league GET    /leagues/:id/invite(.:format)      {:action=>"invite", :controller=>"leagues"}
sendem_league POST   /leagues/:id/sendem(.:format)      {:action=>"sendem", :controller=>"leagues"}

这是我所期望的。我在 League 控制器中有两个函数:“invite”,它创建用于收集电子邮件地址的表单,以及“sendem”,它调用邮件程序来实际发送邀请。

/league/:id/invite 的 get 确实会生成表单。我使用的表单标签如下所示:

<%= form_tag(sendem_league_path, :method => "post") do %>

然而呈现的 HTML 看起来像:

<form accept-charset="UTF-8" action="/leagues/1" class="edit_league" id="edit_league_1" method="post">

因此在提交时会生成一个完全错误的 PUT。(它应该发布到 sendem 函数。)我对路由文件的更改出现在通用资源 :leagues 行上方,因此它应该具有更高的优先级。

我确定我错过了一些非常简单的东西,但我没有想法。(和头发)。

4

2 回答 2

0

您不应该使用 form_tag 来操作资源。您应该使用 form_for。查看表单助手指南- 第 2 节“处理模型对象”。它负责推断是对模型对象使用 POST 还是 PUT。例如,如果您的模型对象是新的,它将在“资源”的 URL 上使用 post。如果它已经是现有的数据库实体,它将使用 PUT 到该“资源”的 URL。

于 2012-06-17T04:30:39.460 回答
0

ARGH 顶部的一些表单处理错误代码(@league 的表单)在页面上创建了第二个表单以进行编辑......(为简洁起见,上面的代码片段省略了)。原始代码似乎可以按预期工作,而其他代码已被注释掉。感谢 vladdruzh 说服我我走在了正确的轨道上,感谢 Salil 让我想到从上到下阅读呈现的 HTML。

于 2012-06-17T14:25:34.383 回答