Получение родительского ресурса из URL

У меня есть два объекта (@stacks и @stories) с отношениями has_many (через @anthologies). Истории можно просматривать по отдельности (/stories/1/) или в виде коллекции в стеке (/stacks/1/stories/1/).

map.resources :stories
map.resources :anthologies
map.resources :stacks, :has_many => :stories do |stack|
  stack.resources :stories
end  

У меня есть эта базовая рабочая структура. Я пытаюсь определить, когда история отображается как часть стека, чтобы я мог построить некоторую навигацию между историями. Я полагаю, что самый простой способ сделать это — проверить URL-адрес основного контроллера, но 1) я не знаю, как это сделать, и 2) это кажется очень не-Railsy, ​​как будто должен быть более прямой путь.

Все еще обдумываю некоторые основы Rails — какие-нибудь рекомендации о том, как добиться желаемой функциональности?


person iamlemur    schedule 30.10.2010    source источник


Ответы (2)


Вы определили как вложенные, так и невложенные маршруты для :stories. Когда ваш StoriesController получает запрос со следующими параметрами:

/stacks/1/stories # nested form

или с этими

/stories # non-nested form

Маршрут будет сопоставлен с {:controller => :stories, :action => :index }. Во вложенной форме хэш параметров будет включать :stack_id => 1. В невложенной форме этого не будет.

person zetetic    schedule 30.10.2010
comment
Спасибо. Я понимаю это в концепции, но мне не хватает того, как я на самом деле проверяю, установлен ли stack_id из представления? Я все еще блуждаю по рельсам и не могу найти правильный способ доступа к переменной, чтобы проверить, установлена ​​ли она, и вернуть значение. Любые указатели? - person iamlemur; 31.10.2010
comment
Это зависит от того, как вы обрабатываете действие контроллера. Обычно вы устанавливаете переменную экземпляра, например @stack = Stack.find(params[:stack_id). Вы можете установить это условно, как в примере before_filter. В представлении вы можете проверить существование переменной, используя defined?, например, ‹%, если она определена? @куча %> - person zetetic; 31.10.2010

если вы обращаетесь к дочернему ресурсу, то параметры по умолчанию будут включать родительский ресурс.

Например, "/stacks/1/stories/2/" будет иметь такую ​​структуру параметров:

{:action => 'show', :controller => 'stories', :stack_id => 1, :id => 2 }

Если вы хотите найти вложенный ресурс в контроллере, просто найдите наличие parent_id в хэше параметров, например:

before_filter :find_stack

protected
def find_stack
  if params[:stack_id]
     Stack.find(params[:stack_id])
  end
end
person heavysixer    schedule 30.10.2010
comment
Не совсем. Должно быть :id => 2, а не :story_id => 2 - person zetetic; 31.10.2010
comment
Это имеет смысл, спасибо. Но я боюсь, что упускаю что-то гораздо более лечебное. Как мне получить к этому доступ из представления? - person iamlemur; 31.10.2010
comment
@iamlemur - возможно, немного опоздал на вечеринку, но, надеюсь, полезен для других - чтобы получить доступ к результату find_stack из представления, также назначьте переменную экземпляра, например @stack = Stack.find(params[:stack_id]). Затем вы можете получить доступ к @stack из представления. - person Steve Folly; 22.03.2017