Rails - соглашения для сложных и вложенных маршрутов (без излишних ресурсов)

В моем приложении есть несколько более сложных маршрутов, которые, как мне кажется, можно превратить в полезные маршруты.

Каковы идеальные соглашения 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-адреса без переопределения помощников?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
127
1

Ответы 1

Переменные пути используются для указания ресурсов, и обычно одна переменная определяет один ресурс. Например:

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

Другие вопросы по теме