Rails - Соглашения для сложных и вложенных маршрутов (без ресурсов) - PullRequest
0 голосов
/ 22 октября 2018

У меня в приложении есть несколько более сложных маршрутов, которые, я думаю, могут быть превращены в ресурсоемкие маршруты.

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

1 Ответ

0 голосов
/ 22 октября 2018

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

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

В случае, если вам нужен доступ к родителям или бабушкам и дедушкам объекта place, вы можете создать:

 get '/places/:place_id/parents/:parent_id/grandparents/:id'

или просто оставьте get '/places/:place_id/parents/:id' и всякий раз, когда вам понадобится доступ к бабушке и дедушке, просто звоните, начиная с вашего родительского места, а не от ребенка.Настройки маршрута могут отличаться в зависимости от ваших потребностей.Rails предоставляет различные примеры на этот счет: Маршрутизация Rails извне

Что касается помощников, не существует общего правила для переопределения или нет ваших методов пути, и опять же, это в основном зависит отпотребности приложений.Я думаю, что это хорошая практика, чтобы сохранить их как можно больше.В вашем случае вместо переопределения метода пути вы можете поместить:

thread_posts_path(thread) + '#post-' + post.id # => /threads/7/posts#post-15

прямо на ваш взгляд, например:

link_to 'MyThredPost', thread_posts_path(thread) + '#post-' + post.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...