HABTMのupdateは面倒だ。
でも http://wiki.rubyonrails.com/rails/pages/CheckboxHABTM ここに詳しく載ってた。(と思ったらリンク先無くなってますね)
<% Group.find(:all).each do |g| %>
<%= check_box_tag "user[group_ids][]",
g.id, @user.groups.include?(g)) %> <%= g.name %>
<% end %>
こんな感じで書いて、controllerのupdateに
@user.groups.clear if !params['user']['group_ids']
こう書いておけばチェック外したらちゃんと消える。
中間テーブルにidがあると変なidが勝手に入るし、Duplicate Entryになる。create時にidがつかないようにしとく。
create_table(:groups_users, :id => false) do |t|
・・・
end
昔ハマったはずなのにまたハマった。鳥頭・・・。
ヘルパー
普段どうやってるかというと、こういうヘルパーを使っています。
def habtm_check_box(object, method, target_method, options = {})
id = object.class.name.underscore
items = method.to_s.camelize.constantize
items.all.map do |item|
label_tag("#{id}_#{method}_#{item.id}",
check_box_tag("#{id}[#{method}_ids][]",
item.id,
object.send(method.to_s.pluralize).include?(item),
:id => "#{id}_#{method}_#{item.id}")+' '+h(item.send(target_method)),
:class => 'checkbox')+"\n"
end.join
end
でgrave(お墓)が複数のcharacter(特徴)を持つ場合、
<%= habtm_check_box @grave, :character, :name %>
みたいな感じで使います。