命名空间资源

时间:2009-11-30 18:16:12

标签: ruby-on-rails namespaces

这是我的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'

我真的不喜欢这个,因为它涉及代码重复并迫使我删除一些铁路魔术助手。

有什么想法和建议吗?

2 个答案:

答案 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