habtm и вложенная форма приводят к нулю

У меня есть 3 модели: продукт, вариация и цвет. Я использую драгоценный камень nested_form.

Product has_many :variations

Variation belongs_to :product
Variation has_and_belongs_to_many :colors

Color has_and_belongs_to_many :variations

Через форму продукта у меня есть вложенная_форма для вариантов. Я хочу связать цвета с помощью флажка, но получаю undefined local variable or method "color_ids"

Модель продукта

def new
  @product = Product.new
  1.times { @product.variations.build }
end

def create
  @product = Product.new(params[:product])
  ...
end

Моя форма //отредактирована//

<%= nested_form_for(@product) do |f| %>
  <% if @product.errors.any? %>
    <div id="error_explanation">
    <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>

  <ul>
  <% @product.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
    </div>
<% end %>
<div class="inline-form">
  <%= f.fields_for :variations %>
  <p><%= f.link_to_add "Add a variation", :variations %></p>
</div>

<div class="actions">
 <%= submit_or_cancel(f) %>
</div>
</div>
<% end %>

А вложенная форма - это базовая таблица с

<table id="new_item">
  <tr>
<th>Name</th>
<th>Color</th>
  </tr>
  <tr>
    <td><%= f.text_field :name, :size => 40 %></td>
    <td><% for color in Color.all %>
      <%= check_box_tag 'variation[color_ids][]', color.id, variation.color_ids.include?(color.id), :id => dom_id(color) %><%= label_tag dom_id(color), color.name, :class => "check_box_label" %>
    <% end %>
</td>
  </tr>
</table>

person Gaelle    schedule 19.11.2011    source источник


Ответы (1)


Я предполагаю, что ваша проблема связана с частью формы, выполняющей color_ids.include?(color.id). Мне нужно увидеть остальную часть вашей формы, чтобы сказать вам, как это исправить.

Это будет что-то вроде variation.color_ids.

Еще одна вещь, которую следует отметить, это стиль цикла for, который странно видеть в типичном/идиоматическом рубине.

Это более характерно:

<% Color.all.each do |color| %>
  <%= check_box_tag 'variation[color_ids][]', color.id, color_ids.include?(color.id), :id => dom_id(color) %><%= label_tag dom_id(color), color.name, :class => "check_box_label" %>
<% end %> 
person TJ Singleton    schedule 19.11.2011
comment
Спасибо за ответ. Вы правы, проблема здесь color_ids.include?(color.id). Я обновил свой вопрос с полной формой. Я тоже пробовал вариант .color_ids, но получаю undefined local variable or method variation' для #‹#‹Class:0x007fc9b52da7b8›:0x007fc9b52bfeb8›` - person Gaelle; 19.11.2011
comment
Я посмотрел код для nested_form, но не смог понять, что вы делаете. Я не уверен, где таблица по отношению к форме. так что я не могу сказать, что будет настраивать ваш контекст. Похоже, это только для новых вариаций. Будет ли у них даже набор связанных цветов? Вы можете заменить variation.color_ids.include?(color.id) на false, если это так. - person TJ Singleton; 22.11.2011