Как получить доступ к параметрам вложенных ресурсов из родительского контроллера в Ruby on Rails?

Я начал писать приложение, которое просматривает книги, статьи и т. д. (название модели: Piece) и имеет возможность просматривать главы или более мелкие разделы (модели разделов, подразделов и подподразделов).

Я хочу иметь возможность создать общий обзор части, где все вложенные разделы, подразделы и подразделы и их атрибуты будут перечислены в одном представлении. Итак, мой файл route.rb выглядит так:

  resources :pieces do
     resources :sections do
       resources :subsections do 
         resources :subsubsections
       end
     end
   end

То, что я с тех пор узнал, небрежно, но уже слишком поздно для меня. На данный момент я смог сделать это из подразделов, потому что у него есть доступ ко всем родительским параметрам (piece_id, section_id и т. д.). Но это означает, что я должен прыгнуть вниз по дереву в представление Subsubsection, а затем перейти оттуда, в то время как я хотел бы иметь доступ ко всем этим параметрам из контроллера Piece, чтобы я мог прямо из представления Piece связать с более общий обзор, без необходимости проходить весь путь по цепочке.

Прошу прощения, если это простой вопрос, я только недавно начал.

Моим моделям нравится вот так:

class Subsubsection < ActiveRecord::Base
  belongs_to :subsection
end

class Subsection < ActiveRecord::Base
  belongs_to :section
  has_many :subsubsections
end

class Section < ActiveRecord::Base
    belongs_to :piece
    has_many :subsections
end

class Piece < ActiveRecord::Base
    has_many :sections
    has_many :links
end

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

def index
    @piece = Piece.find(params[:piece_id])
    @section = @piece.sections.find(params[:section_id])
    @subsection = @section.subsections.find(params[:subsection_id])
end

Мой взгляд обращается к нему следующим образом:

<p><%= link_to "'General Piece Overview", piece_section_subsection_subsubsections_path(@piece, @section, @subsection), class: 'section_name' %></p>

Вот ссылка на проект, вдруг поможет:

https://github.com/kingdavidek/StuddyBuddy


person Kingdavidek    schedule 16.08.2016    source источник


Ответы (1)


В вашем вопросе есть внутреннее напряжение; вы говорите, что хотите получить доступ к вложенным параметрам из вашего PieceController, но если запрос был направлен в PieceController, этих вложенных параметров не будет. При наличии вложенных параметров запрос будет направлен в наиболее конкретный класс контроллера, для которого запрос предоставляет параметр.

Если вопрос можно перефразировать как "как изнутри PieceController я могу сгенерировать что-то вроде оглавления?" ответ выглядит примерно так.

In PieceController:

def show
  @piece = Piece.find(params[:id]).include(sections: {subsections: :subsubsections}})
end

In app/views/pieces/show.html.erb

<% @piece.sections.each do |section| %>
  <%= link_to piece_section_path(@piece, section), section.title %>
  <% section.subsections.each do |subsection| %>
    <%= link_to piece_section_subsection_path(@piece, section, subsection), subsection.title %>
    <% subsection.subsubsections.each do |subsubsection| %>
      <%= link_to piece_section_subsection_subsubsection_path(@piece, section, subsection, subsubsection), subsubsection.title %>
      <% end %>
    <% end %>
  <% end %>
<% end %>

Это делает некоторые предположения, но, надеюсь, идея ясна.

person Jim Van Fleet    schedule 16.08.2016
comment
Привет, спасибо за ответ! Как я понимаю, невозможно сделать то, что я делал изначально, и это нормально. Я попытался реализовать то, что вы делаете, используя метод include, но я получаю NoMethodError в PiecesController#show, неопределенный метод `includes' для #‹Piece:0x000000048936f0›. Вы знаете, почему это является? - person Kingdavidek; 17.08.2016