在rails中路由子资源

时间:2016-05-15 15:51:34

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

所以这是在路线文件中:

  resources :users do
    resources :lamps
  end

我希望能够显示用户的灯"有类似的东西:

http://localhost:3000/users/2/lamps

并使用以下任何用户拥有的所有现有灯具显示:

http://localhost:3000/lamps

两者都非常不同,因为第一个更像是管理视图,而后者更多是用户浏览所看到的。

问题是他们都去了lamp_controller的索引动作

如何在不需要在我的操作/视图中使用if语句的情况下以干净的方式管理它?

1 个答案:

答案 0 :(得分:2)

您可以使用module选项将嵌套路由路由到命名空间控制器:

Rails.application.routes.draw do
  resources :users do
     resources :lamps, only: [:index], module: 'users' 
  end
  resources :lamps, only: [:index]
end

为一组资源执行此操作的另一种方法是:

Rails.application.routes.draw do
  resources :users do
     scope module: 'users'  do
       resources :lamps, only: [:index]
       resources :chairs
       resources :rugs
     end
  end
  resources :lamps, only: [:index]
end

这将允许您在单独的控制器中处理不同的上下文:

# app/controllers/lamps_controller.rb
class LampsController < ApplicationController
  # GET /lamps
  def index
    @lamps = Lamp.all
  end
end

# app/controllers/users/lamps_controller.rb
class Users::LampsController < ApplicationController
  before_action :set_user

  # GET /users/:user_id/lamps
  def index
    @lamps = @user.lamps
    # renders /views/users/lamps/index.html.erb
  end

  private
     def set_user
       @user = User.find(params[:user_id])
     end
end