使用自定义:控制器的标准脚手架form_for和restful资源

时间:2011-03-29 22:22:11

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

我的应用程序中有一个“帐户角色”控制器(用于我的AccountRole模型),使用标准脚手架生成器生成的视图。使用以下路由配置将此控制器嵌套到我的“帐户”控制器(对于我的帐户模型)中:

resources :accounts do
  resources :people, :controller => :account_roles
end

这会产生路由助手,例如account_people_path/accounts/1/people)和account_person_path/accounts/1/person/1)。一切都很好。

我的问题出现在默认生成的_form.html.erb部分。该文件如下所示:

<%= form_for([@account,@account_role]) do |f| %>
  <!-- Rest of form -->
<% end %>

我已经自定义了这个视图来处理嵌套资源,但是我在路由中使用:controller选项会让我产生问题。

我的“新视图”和“编辑”视图的视图规范(两者都使用此部分)导致以下错误:

ActionView::Template::Error:
   undefined method `account_account_role_path' for #<#<Class:0x105334360>:0x105300c18>

认为这里发生的事情是form_for试图“猜测”这些资源的路由助手。我知道我可以通过使用form_for的:url选项覆盖网址,但这感觉就像是一个警察。

我是否错过了一个明显的解决方案,允许我将:controller routing选项与form_for的资源导向样式结合起来?

3 个答案:

答案 0 :(得分:1)

我相信,您可以像这样指定路线

resources :people, :controller => :account_roles, :as => "account_roles"

根据http://guides.rubyonrails.org/routing.html#overriding-the-named-helpers

答案 1 :(得分:1)

如果像我这样的人仍在寻找这个问题的答案,我想我只是想通了。 我做了什么,在你的情况下将是

map.resources:account_roles,:as =&gt; “人” map.resources:people,:controller =&gt; “account_roles”

它为我做了诀窍。

答案 2 :(得分:0)

虽然这篇文章比较老,但我也在努力解决这个问题。

我的解决方案是使用url选项指定路径。

在我的情况下(略有不同,但仍然来自controller: "AccountRoles"的东西)我必须做以下事情:

resources :clients, controller: "AccountClients"


= form_for @client, url: clients_url(@client) do |f|
  = f.error_messages
  %p
    = f.label :name
    = f.text_field :name

  %p= f.submit

因此,您将@client变量传递给表单,但也使用url:设置了正确的网址。

在你的情况下,我认为它会是:

<%= form_for([@account,@account_role], 
      url: account_people_path([@account,@account_role])) do |f| %>
  <!-- Rest of form -->
<% end %>

希望这有助于任何人遇到同样的问题。