nested_attributes in Form Helper - what is the "Rails way"?

We are working with nested attributes and we’ve reached a point where we’re not sure if there is a better, clearer, “more rails” way of dealing with it.

We have 3 models - Organisation, Category and a strictly join table CategoryOrganisation (no additional attributes). The relation between Organisation and Category is many-to-many.

Now, we want to create a form with checkboxes through which the categories for organisations can be added and removed. The example form would look like that:

form1

Now, the form should behave like that:

  • when new action is hit, it should show all categories - unchecked,
  • when create action is hit, but validations are not passing it should render the new view, but keeping the checkboxes that were selected,
  • when edit action is hit, is should show all categories and current categories of the edited organisation should be checked,
  • when create and update are successful, flow is redirected to show action.
    We don’t want to spoil your minds with our custom solution, but to get to know if there is a clear, Rails solution for that.

In our opinion, there is no such solution in Rails documentation, as we found out reading following sources:

In advance, thanks for help!

Have you looked at http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/collection_check_boxes ? Seems to be exactly what you want.

As long as you don’t want the same form to be usable to create new categories, I wouldn’t use nested attributes at all.

f.collection_check_boxes :category_ids, Category.all, :id, :name

will render a checkbox and label for each category, and the check box will be ticked if category_ids contains the element (there are plenty of options to customise the generated markup). I’m not entirely sure what happens if you assign to foo_ids but the overall save fails and rolls back. If you run into issues there I’d add a virtual attribute to hold the assigned ids and actually set category_ids from a before_save or similar.

Fred

OK, thanks for that, it might help.

But how would you in this case send params back to create or update to respectively know which associations (category_organisations) should be created and which deleted?

Thanks,

Piotr

W dniu wtorek, 19 kwietnia 2016 17:19:21 UTC+2 użytkownik Frederick Cheung napisał:

OK, thanks for that, it might help.

But how would you in this case send params back to `create` or `update` to respectively know which associations (category_organisations) should be created and which deleted?

Assigning to category_ids will create/delete rows in the join table as appropriate.

Fred.

Piotr, have a look at http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

There are a ton of things that are auto-created by associations - one is a setter method that reflects the id’s of the association. #collection_check_boxes basically formats your input to match that setter. In this case it would be “category_ids”.

Thank you guys, you helped us a lot! Great to have you around :).

Piotr

W dniu środa, 20 kwietnia 2016 20:04:59 UTC+2 użytkownik Stewart Mckinney napisał: