#ruby-on-rails #associations #ruby-on-rails-3.1
#ruby-on-rails #ассоциации #ruby-on-rails-3.1
Вопрос:
У меня есть приложение Rails 3.1.1 со следующими моделями:
Company
Member
Две модели имеют следующие ассоциации:
Company - has_many :members
Member - belongs_to :company
При добавлении участников я могу ввести идентификационный номер компании, и запись будет успешно связана, я могу искать участников через компанию и т. Д.
Когда я работаю над представлением участника, я хотел бы «вытащить» детали компании.
В настоящее время у меня есть следующее в представлении show:
<h1>Listing members</h1>
<table>
<tr>
<th>Name</th>
<th>Mobile</th>
<th>Email</th>
<th>Qualifications</th>
<th>Membership</th>
<th>Company</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @members.each do |member| %>
<tr>
<td><%= member.name %></td>
<td><%= member.mobile %></td>
<td><%= member.email %></td>
<td><%= member.qualifications %></td>
<td><%= member.membership %></td>
<td><%= @member.company.company_id %></td>
<td><%= link_to 'Show', member %></td>
<td><%= link_to 'Edit', edit_member_path(member) %></td>
<td><%= link_to 'Destroy', member, confirm: 'Are you sure?', method: :delete %></td>
</tr>
<% end %>
</table>
Как мне получить поле от связанной компании? Например, модель компании имеет два поля (широта и долгота).
Комментарии:
1. Есть что-то, чего я здесь не понимаю, не
<%= member.company.latitude %>
сработает?2. В результате получается ‘неопределенная локальная переменная или метод `member’ для #<#<Class:0x99cdcc8>:0x99a8a40>’
3. вы поместили это в цикл members (
<%= member.membership %>
например, прямо ниже)?4. @dannymcc StackOverflow предназначен для устранения неполадок или устранения конкретных ошибок. Вы задаете нам несколько очень простых вопросов, на которые можно (и нужно) ответить, прочитав несколько начальных руководств по Rails. Я рекомендую Rails Guides и Railscasts .
5. @dannymcc вы спрашиваете, не попробовав сначала.
Ответ №1:
Ваш цикл должен выглядеть так:
<% @members.each do |member| %>
<tr>
<td><%= member.name %></td>
<td><%= member.mobile %></td>
<td><%= member.email %></td>
<td><%= member.qualifications %></td>
<td><%= member.membership %></td>
<td><%= member.company_id %></td>
<td><%= member.company.latitude %></td>
<td><%= link_to member.company.name, member.company %></td>
<td><%= link_to 'Show', member %></td>
<td><%= link_to 'Edit', edit_member_path(member) %></td>
<td><%= link_to 'Destroy', member, confirm: 'Are you sure?', method: :delete %></td>
</tr>
<% end %>
company_id
определено в Member
модели, вы не можете получить к нему доступ member.company.company_id
. Чтобы получить доступ к полю в связанной модели компании, используйте member.company.my_field
.
Они будут работать только в цикле members, поскольку они обращаются к |member|
переменной, которая передается в блок.
Комментарии:
1. Спасибо за объяснение! Сработало отлично. Я не понимаю, почему в ссылке на вас не переносите имя ссылки на «? Это только тогда, когда вам нужны статические элементы? Например; <%= link_to ‘Company’, member.company %>
2. @dannymcc Да, вы все правильно поняли. Вы не ставите кавычки при получении имени ссылки из атрибута модели или переменной, только при передаче жестко закодированной строки.
Ответ №2:
@member.company.latitude
et cetera. Пожалуйста, дайте мне знать, если вам нужны разъяснения или дополнительная информация.
Комментарии:
1. Кажется, я получаю сообщение об ошибке для этой компании ‘undefined method` для nil: NilClass’
2. Это должно быть
member
, если вы используете его в цикле в вашем примере. И ваша следующая ошибка будетundefined method 'company_id' for Company....
, и для ее решения вам нужно изменить эту строку:@member.company.company_id
на что-то другое или удалить ее. Затем прочитайте несколько руководств по Ruby / Rails … это базовый материал.