0

私のRailsアプリには、カードモデルとパックモデルがあり、それらの間には多対多の関係があります。パックがちょうど3枚のカードで作成されていることを検証したいと思います。パックは、チェックボックスの実装を使用してカードに関連付けられています。

私の問題:検証を実行すると、関連付けが行われていないようです。検証は失敗し、印刷される出力は「カード数は:0」です。検証が実行されるまでに関連付けが行われないのはなぜですか?(注:検証が削除されると、関連付けが正しく行われるため、検証ではなくコードが機能します)

# Pack Model
class Pack < ActiveRecord::Base
  has_many :pack_elements
  has_many :cards, :through => :pack_elements
  validate :validate_number_of_cards

  def validate_number_of_cards
    puts "cards count is: " + cards.count
    errors.add(:cards, "A pack must contain exactly 3 cards.") if (cards.count != 3)
  end
end

他のモデルは期待どおりですが、検証はありません。これがパックフォームで、すべてのカードが表示され、各カードの横にチェックボックスがあり、送信ボタンがあります。これらのボックスのうち3つだけがチェックされていることをテストしたいのですが、テストをフォームではなくモデルに入れたいと思います。

# packs/_form.html.erb
<%= form_for(@pack) do |f| %>

<div class="field">
  <% @cards.each do |card| %>
      <%= hidden_field_tag "pack[card_ids][]", nil %>
      <%= check_box_tag "pack[card_ids][]", card.id, @pack.card_ids.include?(card.id), id: dom_id(card) %>
      <%= label_tag dom_id(card), card.description %>
      <hr/>
  <% end %>
</div>

<div class="actions">
  <%= f.submit %>
</div>
4

2 に答える 2

0

検証はパック モデルにあります。そのため、Pack Model が保存されると検証がトリガーされます。

Card モデルの保存でこの検証を処理する必要があります。

于 2012-10-13T06:28:00.737 に答える