2015-06-19 2 views
0

У меня есть три модели: проектов, содержащие этапы , который содержит Содержания.Rails вложенных ассоциаций (модели с помощью модели)

В проектах show.html.erb, я хочу показать все этапы, связанные с этим проектом, а затем содержимое, связанное с этими этапами.

Так вот что я пытался в show.html.erb:

<% @stages.each do |stage| %> 
    <section name="concept" class="stage"> 
    <h3><%= stage.name %></h3> 

    <% @contents.each do |content| %> 
     <p><%= content.name %></p> 
    <% end %> 

    </section> 
<% end %> 

И вот что в моей projects_controller.rb

def show 
    project = Project.friendly.find(params[:id]) 
    @stages = project.stages 

    stage = Stage.friendly.find(params[:id]) 
    @contents = stage.contents 
    end 

Вот stage.rb модель:

class Stage < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: :slugged 

    belongs_to :project 
    has_many :contents 
end 

А вот contents.rb:

class Content < ActiveRecord::Base 
    belongs_to :stage 
end 

ошибка, что я получаю:

SQLite3 :: SQLException: нет такой колонки: stages.slug: Выберите "этапы" * FROM. "стадия", где "этапы" "пробковый" 'импульс' ORDER = BY "этапов" "идентификатор" ASC LIMIT 1

Извлеченные источник (около линии № 16):..

stage = Stage.friendly.find(params[:id]) 

EDIT: Проблема заключается в том, что он ищет сцену с идентификатором проекта, а не идентификатором сцены. Я пытаюсь получить Stage, который он показывает, а затем перебирает все содержимое, принадлежащее ему.

+0

Почему вы обретении 'Params [: ID]' как с этапа и проекта в контроллере проектов? Вы отправились в '/ projects/pulse', который затем использует дружественный идентификатор, чтобы найти правильный проект, но у вас нет сцены с пульсом пульса. Что вы пытаетесь сделать в строке 16? –

+0

On Line 16 Я пытаюсь получить сцену и отправить ее содержимое – beaconhill

+0

Но у вас нет одного этапа, у вас их много. –

ответ

2

Проекты контроллер:

def show 
    @project = Project.friendly.find(params[:id]) 
    @stages = @project.stages.includes(:contents) 
end 

Вид:

<% @stages.each do |stage| %> 
    <section name="concept" class="stage"> 
    <h3><%= stage.name %></h3> 

    <% stage.contents.each do |content| %> 
     <p><%= content.name %></p> 
    <% end %> 

    </section> 
<% end %> 
0

В соответствии с friendly_id docs вам необходимо выполнить миграцию, которая добавляет столбец slug к вашей модели Stage. Убедитесь, что вы сделали это и запустите rake db:migrate.

Это то, что не говорит об ошибке:

SQLite3 :: SQLException: нет такой колонки: stages.slug

Вы не добавили этот столбец в таблицу этапов еще.

Вы должны дать ему идентификатор этапа. В своем коде вы используете один и тот же идентификатор в обоих находок:

project = Project.friendly.find(params[:id]) 
@stages = project.stages 

stage = Stage.friendly.find(params[:id]) 

Вы используете params[:id] дважды. Должны быть некоторые другие параметры, которые вы могли бы использовать, возможно, params[:stage_id], предполагая, что вы настроили вложенные маршруты. Как правило, родительская модель имела бы params[:project_id], а params[:id] - идентификатор модели вложенной сцены.

+0

Проблема заключается в том, что он ищет этап с идентификатором проекта, а не идентификатор сцены. – beaconhill

+0

Обновлен мой ответ. – DiegoSalazar