Рельсы, отображающие реализацию формы данных HABTM

#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, поэтому я полагаю, что это вызывает проблему…