这是我的config / routes.rb文件的摘录:
resources :accounts do |account|
account.resource :profile, :except => [:new, :create, :destroy]
account.resources :posts,
:collection => { :fragment => :get },
:has_many => [:comments, :likes]
# even more code
end
我希望从帐户命名空间加载每个嵌套资源,例如 Account :: PostsController ,而不是 PostsController 。
使用资源:accounts, :namespace => 'account'
尝试加载AccountPostsController。
尝试嵌套结构并没有真正发挥作用:
map.namespace :account do |account|
..
end
之前的代码将从我想要的位置加载文件,但它会将命名空间添加到url和生成的路径,因此我将使用account_account_posts_url
和类似路径等方法。
另一种选择是使用类似的东西:
account.resource :profile, :controller => 'account/profile'
我真的不喜欢这个,因为它涉及代码重复并迫使我删除一些铁路魔术助手。
有什么想法和建议吗?
答案 0 :(得分:1)
这样的事情怎么样?
map.resources :accounts do |accounts|
accounts.with_options(:namespace => "account") do |account|
account.resource :profile, :except => [:new, :create, :destroy]
...
end
end
我没有尝试过,所以不知道它是否会起作用,但这是一个开始。有关使用Rails路由可以执行的操作的详细信息和选项,请参阅Rails Routing。
投票后
所以我做了一些测试。更改了我的routes.rb
并正在运行rake routes
,并提出了以下内容(非常接近我必须开始的内容):
map.resources :accounts do |accounts|
accounts.namespace :account do |account|
account.resource :profile, :except => [:new, :create, :destroy]
end
end
这可以满足您的需求。正确的URL并指向account/...
控制器。
答案 1 :(得分:0)
那么命名空间有什么特别的错误?我想这就是你要做的事情:
map.namespace :account do |account|
account.resource :profile
end
这将尝试在 app / controllers / account / profiles_controller.rb 加载控制器,并生成account_profile_path
等路由。
根据评论更新:
map.resources :accounts do |account|
account.resource :profile
end
会给你 / accounts / 22 / profile 。