我的应用包含模式的父资源(has_many)和片段的子资源(belongs_to)。我的愿望是建立一些特定页面的自定义路线,我想知道最好的方法。现在,这是我的工作,但我想知道是否有更好的方法,因为我读到自定义路由的文章告诉我这不是一个好的做法。
我故意没有嵌套资源,因为片段需要独立存在以及在父模式的上下文中查看。
目标是能够创建一些自定义视图,如下所示:
http://patterns.dev/patterns/:id/snippets //Got this one working, but incorrectly I believe
http://patterns.dev/patterns/:id/snippets/sort // Show all snippets for pattern to sort
http://patterns.dev/patterns/:id/images // Show all the images for patterns to moderate
的routes.rb
Rails.application.routes.draw do
devise_for :users, :path => '', :path_names => {:sign_in => 'login', :sign_out => 'logout'}
resources :patterns
get 'patterns/:id/snippets' => 'patterns#snippets', as: 'pattern_snippets'
resources :snippets
root 'welcome#index'
end
答案 0 :(得分:1)
我想nested resources就是你所需要的。您可以仅指定嵌套的索引操作,并分别保留所有代码段资源。您还要为snippets#index
操作添加一些逻辑以检查params[:pattern_id]
是否存在:
resources :patterns do
# this line will generate the `patterns/:id/snippets` route
# referencing to snippents#index action but within specific pattern.
# Also you have to add pattern_id column to snippets table to define the relation
resources :snippets, only: :index
end
resources :snippets
使用收集路由使Rails识别/patterns/:id/snippets/sort
resources :patterns do
resources :snippets, only: :index do
# this line will generate the `patterns/:id/snippets/sort` route
# referencing to snippets#sort action but again within specific pattern.
get :sort, on: :collection
end
end
resources :snippets
如果你有Image
模型,你可以像使用代码片段一样嵌套资源:
resources :patterns do
resources :images, only: :index
end
如果它只是模式控制器中的一个动作,你可以这样做:
resources :patterns do
get :images, on: :member
end