我的应用程序中设置了一些更复杂的路由,我想知道是否可以将其转换为资源丰富的路由。
理想的Rails约定是将它们转换为足智多谋的路线吗?
路线1:/ grandparent-place / parent-place / place /
这些路由位于我的route.rb文件的底部,因为它们是从根路径提取的,并且受父母和孩子的限制。
Routes.rb
get ':grandparent_id/:parent_id/:id', to: 'places#show', as: :grandparent_place
get ':parent_id/:id', to: 'places#show', as: :parent_place
get ':id', to: 'places#show', as: :place
Places_Controller.rb
def set_place
if params[:parent_id].nil? && params[:grandparent_id].nil?
@place = Place.find(params[:id])
elsif params[:grandparent_id].nil?
@parent = Place.find(params[:parent_id])
@place = @parent.children.find(params[:id])
else
@grandparent = Place.find(params[:grandparent_id])
@parent = @grandparent.children.find(params[:parent_id])
@place = @parent.children.find(params[:id])
end
end
Application_Helper.rb
def place_path(place)
'/' + place.ancestors.map{|x| x.id.to_s}.join('/') + '/' + place.id.to_s
end
路由2:/ thread#post-123
这些路由只允许使用父模块来指定控制器目录,并使用#锚滚动到指定的帖子,从而允许特定的操作。
Routes.rb
resources :threads, only: [:show] do
resources :posts, module: :threads, only: [:show, :create, :update, :destroy]
end
Application_Helper.rb
def thread_post_path(thread, post)
thread_path(thread) + '#post-' + post.id.to_s
end
是否在应用程序帮助程序中覆盖路由路径,还是有一种更好的方法在不覆盖帮助程序的情况下生成正确的URL?
答案 0 :(得分:0)
路径变量用于指定资源,通常一个变量指定一种资源。例如:
get '/publishers/:publisher_id/articels/:article_id/comments/:id'
在您的设置中,您拥有places
作为资源。
因此,在此端点get '/places/:id'
中:id指定应撤退的地点。
关于您的第一个路线,最合适的是只留下一个get端点:
resource :places, only: [:show] # => get '/places/:id'
,并在需要检索父母或祖父母的地方时将父母或祖父母的ID传递为:id。这样,您将不需要set_place方法中的任何条件,因此有:
def set_place
@place = Place.find(params[:id])
end
如果您需要访问位置对象的父母或祖父母,则可以构建:
get '/places/:place_id/parents/:parent_id/grandparents/:id'
或离开get '/places/:place_id/parents/:id'
,只要您需要访问祖父母,就从您的父母而不是孩子的地方开始通话。路线设置可能会根据您的需要而有所不同。 Rails提供了有关此问题的各种示例:Rails Routing from the Outside In
关于助手,没有覆盖或不覆盖路径方法的通用规则,它再次主要取决于应用程序的需求。我认为这是保持它们尽可能完整的一种好习惯。在您的情况下,可以覆盖以下方法,而不是覆盖path方法:
thread_posts_path(thread) + '#post-' + post.id # => /threads/7/posts#post-15
在您看来完全一样,例如:
link_to 'MyThredPost', thread_posts_path(thread) + '#post-' + post.id