Multiple checkboxes for a has_many through not saving

116 views
Skip to first unread message

why-el

unread,
Dec 25, 2012, 7:15:18 PM12/25/12
to rubyonra...@googlegroups.com

I Copied this from StackOverflow since I did not get any response there. There is an update at the end. 

I am not sure why my checkboxes for a has_many through are not saving. This is a rather complex form (An online application for a language summer program) so in addition to regular applicant information, I am collecting attributes of a LanguageBackgroundAndInterest model using a fields_for. Part of these attributes are the books that the applicant used to learn the language. The code looks like this:

    <%= f.fields_for :language_background_and_interest do |builder| %>
      <div class="field"> 
      <%= hidden_field_tag "language_background_and_interest[book_ids][]" %>
      <% Book.all.each do |book| %>
        <br><%= check_box_tag "language_background_and_interest[book_ids][]", book.id %>
        <%= book.name.humanize %>
      <% end %>
      </div>
    <% end %>

Both the language_background_and_interest and books are joined together using a has_many_through like so:

class LanguageBackgroundAndInterest < ActiveRecord::Base
  attr_accessible :book_ids

  has_many :language_background_books
  has_many :books, through: :language_background_books
end

class Book < ActiveRecord::Base
  attr_accessible :name, :publisher

  has_many :language_background_books
  has_many :language_background_and_interests, through: :language_background_books
end

# Join Table
class LanguageBackgroundBook < ActiveRecord::Base
  attr_accessible :language_background_and_interest_id, :book_id
  belongs_to :language_background_and_interest
  belongs_to :book
end

I am not sure why the books from the checkboxes don't get assigned to the appropriate background model. Any ideas?

PS: Granted, this design is rather ambiguous (Why not make books belong to an applicant?), but I currently want to put up a prototype and I am also constrained by a dubious requirement. So I need this working.

Update: 

I appended the word "attributes" bellow to the language_background model in the hope that the books_ids array gets inserted properly into the params hash with the other attributes. Inspecting the development.log, I can see the key language_background_and_interest_attributes twice: One for all the other data which get successfully saved, and one for the book_ids array which apparently gets ignored. Any ideas?

    <%= f.fields_for :language_background_and_interest do |builder| %>
      <div class="field"> 
      <%= hidden_field_tag "language_background_and_interest_attributes[book_ids][]" %>
      <% Book.all.each do |book| %>
        <br><%= check_box_tag "language_background_and_interest_attributes[book_ids][]", book.id %>
        <%= book.name.humanize %>
      <% end %>
      </div>
    <% end %>

Frederick Cheung

unread,
Dec 26, 2012, 8:23:53 AM12/26/12
to Ruby on Rails: Talk


On Dec 26, 12:15 am, why-el <wael.khobala...@gmail.com> wrote:
>
> I appended the word "attributes" bellow to the language_background model in
> the hope that the books_ids array gets inserted properly into the params
> hash with the other attributes. Inspecting the development.log, I can see
> the key language_background_and_interest_attributes twice: One for all the
> other data which get successfully saved, and one for the book_ids array
> which apparently gets ignored. Any ideas?
>

What does that log look like? You'd probably need to nest it in the
hash for the parent attributes ie
some_model[language_background_and_interest_attributes][some_id]
[book_ids]

The some_id for a saved record would be just its id. If you're adding
fields on the fly, then you'll have to have the matching id - check
what other parameters get submitted

Fred
Reply all
Reply to author
Forward
0 new messages