私の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>