В моем приложении есть несколько более сложных маршрутов, которые, как мне кажется, можно превратить в полезные маршруты.
Каковы идеальные соглашения Rails для превращения их в эффективные маршруты?
Маршрут 1: / grandparent-place / parent-place / place /
Эти маршруты находятся внизу моего файла routes.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-адреса без переопределения помощников?





Переменные пути используются для указания ресурсов, и обычно одна переменная определяет один ресурс. Например:
get '/publishers/:publisher_id/articels/:article_id/comments/:id'
В вашей настройке у вас есть places в качестве ресурса.
Итак, в этой конечной точке get '/places/:id': id указывает, какое место должно быть извлечено.
Что касается вашего первого маршрута, лучше всего оставить только одну конечную точку получения:
resource :places, only: [:show] # => get '/places/: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 предоставляет различные примеры по этому поводу: Маршрутизация рельсов извне внутрь
Что касается помощников, нет общего правила для переопределения или отказа от ваших методов пути, и опять же, это в основном зависит от потребностей приложения. Я думаю, что это хорошая практика - как можно дольше сохранять их нетронутыми. В вашем случае вместо переопределения метода пути вы можете разместить:
thread_posts_path(thread) + '#post-' + post.id # => /threads/7/posts#post-15
прямо на ваш взгляд, например:
link_to 'MyThredPost', thread_posts_path(thread) + '#post-' + post.id