【问题标题】:How to to route "nested" paths by using `namespace` or `scope :module` / `scope :path`?如何使用 `namespace` 或 `scope :module` / `scope :path` 路由“嵌套”路径?
【发布时间】:2015-04-08 17:27:12
【问题描述】:

我正在使用 Ruby on Rails 4.2,我想在 resource 的块中使用 namespacescope :module / scope :path 来路由“嵌套”路径。

也就是说,我有如下路线:

resources :users, :only => [:show]

匹配

user_path    GET    /users/:id(.:format)    users#show

我想匹配以下路径

users_sessions_path         POST      /users/sessions              users/sessions#create
user_session_path           GET       /users/:id/session           users/sessions#show
delete_user_session_path    GET       /users/:id/session/delete    users/sessions#delete
user_session_path           DELETE    /users/:id/session           users/sessions#destroy

我阅读了official documentation 并试图陈述类似的内容

resources :users, :only => [:show] do
  scope :module => :users do
    scope :module => :sessions do 
    # scope :path => :sessions do
    # namespace :sessions do
      ...
    end
  end
end

但没有任何尝试成功。我应该如何陈述路线?


更新@dgilperez 回答后

我尝试了以下代码

resources :users, :only => [:show] do
  scope :module => :users do
    resource :session, :only => [:show, :new, :create, :destroy] do
      get :delete, :on => :collection, :to => 'sessions#delete' 
    end
  end
end

匹配

delete_user_session_path     GET       /users/:user_id/session/delete(.:format)    users/sessions#delete
new_user_session_path        GET       /users/:user_id/session/new(.:format)       users/sessions#new
user_session_path            POST      /users/:user_id/session(.:format)           users/sessions#create
user_session_path            GET       /users/:user_id/session(.:format)           users/sessions#show
                             DELETE    /users/:user_id/session(.:format)           users/sessions#destroy

但我仍然需要映射newcreate 操作,而无需传递:user_id 参数。也就是说,我想映射类似的东西

new_user_session_path        GET       /users/session/new(.:format)       users/sessions#new
user_session_path            POST      /users/session(.:format)           users/sessions#create

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 routing routes


    【解决方案1】:

    我认为您过于复杂:您不需要使用scopepath 来呈现嵌套资源。您只需嵌套它们:

    resources :users, :only => [:show] do
      resources :sessions
    end
    

    将呈现以下路线:

    user_sessions     GET    /users/:user_id/sessions(.:format)            sessions#index
                      POST   /users/:user_id/sessions(.:format)            sessions#create
    new_user_session  GET    /users/:user_id/sessions/new(.:format)        sessions#new
    edit_user_session GET    /users/:user_id/sessions/:id/edit(.:format)   sessions#edit
    user_session      GET    /users/:user_id/sessions/:id(.:format)        sessions#show
                      PATCH  /users/:user_id/sessions/:id(.:format)        sessions#update
                      PUT    /users/:user_id/sessions/:id(.:format)        sessions#update
                      DELETE /users/:user_id/sessions/:id(.:format)        sessions#destroy
    user              GET    /users/:id(.:format)                          users#show
    

    这些不是您提到的您需要的路线,但我希望您重新考虑是否真的需要它们,使用命名空间控制器和自定义名称,例如delete_user_,或者您更喜欢更标准。如果你真的需要这些确切的路线,请告诉我。


    更新 OP 更新后

    要使两条路线丢失,您需要将它们从剩余资源中取出。我会直接这样写它们:

    resources :users, :only => [:show] do
      scope :module => :users do
        resource :session, :only => [:show, :destroy] do
          get :delete, :on => :collection, :to => 'sessions#delete' 
        end
      end
    end
    
    get 'users/session/new', to: 'users/sessions#new', as: :new_user_session
    post 'users/session', to: 'users/sessions#create'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2020-08-22
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      相关资源
      最近更新 更多