Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-路由资源复制_Ruby On Rails_Ruby_Routes - Fatal编程技术网

Ruby on rails Rails-路由资源复制

Ruby on rails Rails-路由资源复制,ruby-on-rails,ruby,routes,Ruby On Rails,Ruby,Routes,我在routes.rb文件中设置了以下路由: Rails.application.routes.draw do devise_for :users resources :bookings do collection do get :my_bookings end end resources :spaces, only: [:index, :new, :create, :show] do resources :bookings, only:

我在routes.rb文件中设置了以下路由:

Rails.application.routes.draw do
  devise_for :users

  resources :bookings do
    collection do
      get :my_bookings
    end
  end

  resources :spaces, only: [:index, :new, :create, :show] do
    resources :bookings, only: [:index, :new, :create, :show]
  end

  resources :bookings do
    resources :payments, only: :new
  end

  root to: 'pages#home'
  get 'about', to: 'pages#about'

  mount StripeEvent::Engine, at: '/stripe-webhooks'
end
我重复了
resources:bookings
3次:两次,因为我知道这是一种很好的做法,可以避免集合中嵌套的资源超过一个级别和另一个级别

当我在路线的末尾添加收集部分时,rails忽略了它,而它只是点击了show动作

最后我阅读并移动了收藏部分


现在一切都正常了,但是路线文件很庞大,而且资源也很丰富:预订重复了3次。有没有一种方法可以以较少的重复来重构这些路径

您可以将两个顶级(非嵌套的)
资源:bookings
块组合在一起,如下所示:

Rails.application.routes.draw do
为:用户设计
资源:预订吗
收藏办
获取:我的预订
结束
资源:仅限付款::新建
结束
资源:空间,仅:[:索引,:新建,:创建,:显示]执行
资源:预订,仅:[:索引,:新建,:创建,:显示]
结束
根目录为:“页面#主页”
获取“关于”,至:“页面#关于”
安装StripeEvent::引擎,位置:'/stripe webhooks'
结束

这应该是同等的,而且要整洁一点。您必须保留嵌套的
资源:bookings
,但这是完全可以的。而且对于
/spaces/:space\u id/bookings
URL结构来说是必要的。

如果你只是专注于避免重复,就不会真正改善路线。DRY很好,但在重构时,它确实应该排在优先顺序的后面。相反,您希望专注于使您的路由具有RESTful,并在不同的上下文中处理相同的资源:

Rails.application.routes.draw do
  devise_for :users

  # /bookings/my_bookings is not very RESTful as its "backwards" 
  # a better solution is /my/bookings or /user/bookings which are real nested routes
  # @see https://guides.rubyonrails.org/routing.html#singular-resources
  resource :user, only: [] do
    # this will route /user/bookings to Users::BookingsController
    resources :bookings, only: [:index], module: :users
  end

  resources :spaces, only: [:index, :new, :create, :show] do
    # shallow: true will prevent the member routes from being nested 
    # it will also prevent resources :payments from being nested in `/spaces/`
    resources :bookings, shallow: true do
       resources :payments, only: :new, shallow: true
    end
  end

  root to: 'pages#home'
  get :about, to: 'pages#about'

  mount StripeEvent::Engine, at: '/stripe-webhooks'
end

有两种方法可以在不同的上下文中处理相同的资源。您可以将所有内容移动到同一个控制器中,并根据“父id”参数的存在添加代码分支,也可以将请求路由到不同的控制器。后者避免违反单一责任原则。

我创建了一个单独的控制器:
#controllers/users/bookings\u controller.rb
。包含以下内容:
class Users::BookingsController
以及视图``views/Users/bookings/index.html.erb```。一切都很好,不知道我是否过度复杂的文件夹结构和违反一些名称约定…完美。它根本没有过度使用。