#ruby-on-rails #has-and-belongs-to-many
#ruby-on-rails #имеет и принадлежит многим
Вопрос:
Я новичок в rails и у меня проблемы с выяснением того, как отображать данные с помощью отношения HABTM. 1. Ситуация такова, что я пытаюсь создать простой инструмент, в котором у меня есть устройства, которым назначена модель, и у каждой модели могут быть определенные запасные части. 2. Мне удалось создать связь HABTM и таблицу для назначения моделей запасным частям и сохранить ее в БД. 2. Я хочу иметь возможность создавать заявки для устройств, где во время создания заявки пользователь должен иметь возможность заказывать запасные части (но только из списка деталей для этой конкретной модели устройства!). 3. Я застрял, как при создании билета отображать детали только для конкретной модели устройства (я передаю model_id как parm в URL). Вероятно, в конце концов, чтобы сохранить его в базе данных, мне нужно было бы использовать дополнительную таблицу HABTM tickets_parts, но теперь я только хочу знать, как это отобразить. 4. Я получаю неопределенный метод `models’ для #
Заранее большое спасибо за предложения и помощь по этому вопросу!
Модели выглядят как:
class Model < ActiveRecord::Base
has_and_belongs_to_many :parts
accepts_nested_attributes_for :parts
end
class Device < ActiveRecord::Base
belongs_to :model
end
class Part < ActiveRecord::Base
has_and_belongs_to_many :models
has_and_belongs_to_many :order_tickets
accepts_nested_attributes_for :models
end
мои билеты /_form.html.erb выглядят так:
<%= form_for(@ticket) do |f| %>
<% if @ticket.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@ticket.errors.count, "error") %> prohibited this ticket from being saved:</h2>
<ul>
<% @ticket.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br>
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :counter %><br>
<%= f.number_field :counter %>
</div>
<div class="field">
<%= f.label :issue %><br>
<%= f.text_area :issue %>
</div>
<!-- Here i want to display the spare parts only for the specific model -->
<% Part.models(:model_id).each do |x| %>
<%= x.name %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Ответ №1:
Извлеките модель в переменной экземпляра в контроллере, а затем в форме, которую вы можете использовать:
<% @model.parts.each do |x| %> <%= x.name %> <% end %>
Примечание: «Модель» не является зарезервированным словом, но я бы посоветовал не использовать его в качестве имени класса.
Комментарии:
1. Я поместил def commonstuff @model = Model.find(params[:model_id]) end в tickets controller и before_action :commonstuff. Но теперь получаем: неопределенный метод `parts’ для nil:NilClass
2. Привет, тогда вы должны проверить, соответствует ли экземпляр модели в БД передаваемому вами значению id.
3. Да, я совпадаю. Я заметил кое-что еще, когда я просто хотел напечатать переменную модели, используя <%= @model.inspect %>, она по-прежнему показывает Nil, поэтому я полагаю, что это вызывает проблему…