我在 Rails 中遇到嵌套路由的问题,我不知道我做错了什么。
简而言之:我使用 Devise 进行身份验证和注册。现在我想让用户输入有关他的联系数据的更多详细信息。为了保持用户模型小,我想使用一个不同的模型,称为帐户。由于用户只有一个帐户,因此我使用一对一关联和嵌套路由。但不知何故,路由不起作用。这是我的用户模型:
用户.rb
class User < ActiveRecord::Base
has_one :account, :dependent => :destroy
attr_accessible :username, :email, :password, :password_confirmation, :remember_me
这是我的帐户模型:
帐号.rb
class Account < ActiveRecord::Base
attr_accessible :anrede, :land, :nachname, :plz, :stadt, :strasse, :user_id, :vorname
belongs_to :user
end
我的路线文件如下所示:
路线.rb
devise_for :users, :path => 'members'
resources :users do
resource :account
end
由于用户可能还没有帐户,因此我在我看来对此进行了测试:
<% if current_user.account.try %>
<li><%= link_to "Account", user_account_path %></li>
<% else %>
<li><%= link_to "create Account", new_user_account_path %></li>
<% end %>
但是当我使用登录用户进入根路径时,Rails 告诉我
Routing Error
No route matches {:action=>"new", :controller=>"accounts"}
但是我的 accounts_controller.rb 中有一个新操作,因为我已经搭建了整个 CRUD 集(使用 current_user.build_account 编辑创建),它也是 rake 路由给出的路径。
我绝望地陷入了这个困境!有人可以帮我吗?
编辑 这是我的 rake 路线的输出:
user_account POST /users/:user_id/account(.:format) accounts#create
new_user_account GET /users/:user_id/account/new(.:format) accounts#new
edit_user_account GET /users/:user_id/account/edit(.:format) accounts#edit
GET /users/:user_id/account(.:format) accounts#show
PUT /users/:user_id/account(.:format) accounts#update
DELETE /users/:user_id/account(.:format) accounts#destroy
编辑2
这是操作新表单的错误消息:
NoMethodError in Accounts#new
Showing /home/stonjarks/Work/toytrade_devise/app/views/accounts/_form.html.erb where line #1 raised:
undefined method `accounts_path' for #<#<Class:0xa44d0cc>:0xab6222c>
Extracted source (around line #1):
1: <%= form_for(@account) do |f| %>
2: <% if @account.errors.any? %>
3: <div id="error_explanation">
4: <h2><%= pluralize(@account.errors.count, "error") %> prohibited this account from being saved:</h2>
我使用这个 SO hack 解决了这个问题,但无论如何这是一个奇怪的行为:
<%= form_for @account,:url=>{:action=>:create}
但无论如何,我仍然不明白这条路线的意义。尽管如此,我还是无法找到显示帐户的路线:
/用户/1/帐户
ActiveRecord::RecordNotFound in AccountsController#show
Couldn't find Account without an ID