我的应用程序中有一个“帐户角色”控制器(用于我的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
的资源导向样式结合起来?
答案 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 %>
希望这有助于任何人遇到同样的问题。