【问题标题】:Basic nested routing in Rails 3Rails 3 中的基本嵌套路由
【发布时间】:2012-06-17 18:41:44
【问题描述】:

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

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

我添加了以下我的 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 行之上,因此它应该具有更高的优先级。

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

【问题讨论】:

  • 尝试 :method => :post 并删除括号。
  • MurifoX 没有区别 :(
  • 为什么没有类似 form_tag(sendem_league_path(league.id)).... 我的意思是你的路线需要一个参数

标签: ruby-on-rails-3 rails-routing


【解决方案1】:

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

【讨论】:

  • 我已经有这个资源的 CRUD 函数——这些是最多从模型属性中读取的附加函数(没有写入、创建或更新)。我也尝试过将这些功能移到单独的控制器中的方法,但这种方法也不起作用。
【解决方案2】:

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

【讨论】:

  • 这个问题回答了吗?如果是这样,请发布解决方案(代码)并接受答案。
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多