Концептуальное понимание ассоциаций в Rails (рендеринг и публикация)

Я прочитал руководство Rails по ассоциациям, а также ответил на кучу вопросов здесь, на SO и на Reddit, но я думаю, что просто концептуально не получаю ассоциаций. У меня есть две конкретные проблемы, которые я могу использовать в качестве примеров из приложения, над которым я работаю, но на самом деле я просто пытаюсь понять, что я делаю.

Модели для этих примеров:

List
        belongs_to :user
        has_many :items
Item
        belongs_to :list
        belongs_to :user
User
        has_many :lists
        has_many :items

Проблема 1: ассоциации рендеринга

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

Users/show
    <%= render @list %>
Lists/_list 
    <ol> 
        <%= list.name %>
        <%= render list.items %>
    </ol>
Items/_item 
     <li><%= item.name %></li>

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

<ol>    
  List(a)
  List(b)
  List(c)
    <li>item(a)</li>
    <li>item(b)</li>
</ol>

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

Редактировать: я избавился от второй проблемы, так как сообщение было длинным и могло быть отдельным сообщением. Повторяя вышесказанное, как можно взять указанную выше коллекцию и успешно отобразить ее на вкладках, где списки являются вкладками, а связанные элементы отображаются как содержимое? У меня возникают проблемы, если я использую такой код в своих пользователях/шоу:

<div class="row"> 
    <div class="col s12">
         <ul class="tabs">
                  <%= render @lists %>
          </ul>
      </div>
      <%=render @items %>
</div>

Списки/_список

     <li class="tab col s3"><a href="#tab_<%=list.id%>"><%= list.name%></a></li>

Предметов/_item

       <div id="#tab_<%=list.id%>" class="col s12"><%= item.name %></div>

Если я попытаюсь это сделать, то часть моего элемента выдаст мне ошибку, потому что я не могу вызвать list.id, и он просто отобразит все мои элементы, не отображая их как связанную коллекцию со списками. Если я вложу это и поставлю все после ‹%=списков рендеринга %> внутри частичного списка, тогда коллекции будут работать, но закрывающие теги в конечном итоге вызовут проблемы. Я не уверен, как решить эту проблему.


person mochimantis    schedule 23.07.2015    source источник


Ответы (1)


Передача коллекций для рендеринга имеет очень мало общего с ассоциациями, скажем так: вам следует обратиться к макетам и рендерингу. руководство вместо этого.

Когда вы вызываете рендер с коллекцией (массив экземпляров модели), Rails создает цикл и использует имя модели и соглашения для поиска правильного партиала для каждого члена коллекции.

Rails не волнует, что коллекция пришла из ассоциации.

добавлен:

Поскольку связь между списком и элементом является двунаправленной, вы всегда можете получить доступ к списку, к которому принадлежит элемент, с помощью item.list:

# views/items/_item.html.erb
<div id="tab_<%= item.list.id %>" class="col s12">
  <%= item.name %>
</div>

Также обратите внимание, что я удалил # в начале идентификатора, так как это недопустимый символ для идентификатора элемента.

person max    schedule 24.07.2015
comment
Я отредактировал и обновил свой пост, чтобы уточнить, что я ищу более конкретно. Спасибо за подсказку о макетах и ​​рендеринге. Меня очень зацепил вопрос ассоциаций. На самом деле, у меня в коде было ‹%= render list.items %›, но я облажался, когда создавал пост по памяти. - person mochimantis; 25.07.2015
comment
Спасибо большое. Не могу поверить, что упустил из виду что-то настолько простое, как то, что вы добавили к своему ответу. Я очень, очень ценю это. - person mochimantis; 28.07.2015