Получение родительского ресурса из URL
-
27-09-2019 - |
Вопрос
У меня есть два объекта (@stacks и @stories) с отношениями has_many (через @anthologies). Истории могут быть просмотрены индивидуально (/ истории / 1 /) или в качестве коллекции в стеке (/ стеки / 1 / истории / 1 /).
map.resources :stories
map.resources :anthologies
map.resources :stacks, :has_many => :stories do |stack|
stack.resources :stories
end
У меня есть эта базовая рамка, работающая, я пытаюсь определить, когда история оказывается как часть стека, чтобы я мог создать некоторую навигацию между историями. Я понимаю, что это самый простой способ сделать это - проверять URL для первичного контроллера, но 1) Я не знаю, как это сделать, а 2) кажется очень неренесинси, как будто должен быть более прямым способом.
Еще голову вокруг некоторых оснований рельсов здесь - любые рекомендации о том, как достичь желаемой функциональности?
Решение
Вы определили как вложенные, так и не вложенные маршруты для :stories
. Отказ Когда ваш StorivesController получает запрос с этими параметрами:
/stacks/1/stories # nested form
или с этим
/stories # non-nested form
Маршрут будет отображаться на {:controller => :stories, :action => :index }
. Отказ В вложенной форме параметры HASH будут включать :stack_id => 1
. Отказ В не вложенной форме это не будет.
Другие советы
Если вы получаете доступ к дочерним ресурсам, то параметры будут включать родительский ресурс по умолчанию.
Например, "/ Stacks / 1 / Stories / 2 /" будут иметь структуру параметров, как это:
{:action => 'show', :controller => 'stories', :stack_id => 1, :id => 2 }
Если вы хотите найти вложенный ресурс в контроллере, просто ищите наличие Parent_ID в парами Hash HASH, например:
before_filter :find_stack
protected
def find_stack
if params[:stack_id]
Stack.find(params[:stack_id])
end
end