0

I have two models; question and category which have a HABTM association between them. Now I want to have a form where I can edit the questions categories, however I don't know how. I started with this but I am lost, I am unsure on what to name the "name" attributes etc and how it is automatically edited/created with the question, how do I set this up?

<%= f.fields_for :categories do |categories_form| %>
        <%= categories_form.select "category_ids", Category.all.collect { |c| [c.description, c.id] }, {}, {:multiple => true, :size => 9} %>
    <% end %>

I managed to set up question(has_many) --> answer with fields_for and accepts_nested_attributes_for, but not this.

J. Steen
  • 15,470
  • 15
  • 56
  • 63
LuckyLuke
  • 47,771
  • 85
  • 270
  • 434

2 Answers2

1

You should take a look at the following screencasts by Ryan Bates Nested Model Form Part 1 and Nested Model Form Part 2.

vvlad
  • 569
  • 2
  • 4
0

Migrations

You need to create the migrations for the tables

You need to create the migration for the middle table of the association + the middle table name that is created by the association is :categories_questions or :questions_categories, in the second case you must define the name in models as shown in the link Do I need to manually create a migration for a HABTM join table?

class CreateCategoriesQuestions < ActiveRecord::Migration
  def self.up
    create_table :categories_questions, :id => false do |t|
        t.references :category
        t.references :question
    end
    add_index :categories_questions, [:category_id, :question_id]
    add_index :categories_questions, [:question_id, :category_id]
  end

  def self.down
    drop_table :categories_questions
  end
end

Question Model

class Question < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

Category Model

class Category < ActiveRecord::Base
  has_and_belongs_to_many :questions
end

Controller Stuf

questions_controller.rb

def new
  @question = Question.new
  @question.categories.build #Build a categories_questions so as to use fields_for 
end  

Form Stuff

= f.fields_for :categories do |categories_fields|
  = categories_fields.text_field :name
  = categories_fields.text_field :description

At this point i must tell you ( i am new in ruby & rails ) that to create a new object here you can use jquery to append a html block name properly, or create helpers (that use javascript in the end) to add a new object and on save, save the association. In the next link someone demonstrated the exact way .

http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for#512-Setting-child-index-while-using-nested-attributes-mass-assignment

Community
  • 1
  • 1
Leftis
  • 119
  • 9