I am trying to implement HMT for the first time and having a ton of
trouble. I would like to be able to have the user check a checkbox
and fill some extra fields for data input. I have tried so many
iterations borrowed from different places I found on the web, none
seem to work quite right. Essentially I have two models: ‘practice’
and ‘system’ where a practice can have one or many systems and I have
a join model called ‘implementation’ where I also store some
additional attributes such as who implemented the software and when.
I have now rolled all my code back to the basics following the HABTM
railscast. So right now when I check a checkbox (choosing the system)
the join model (implementation) does get both system ID’s but I cant
figure out how to correctly add the additional 3 fields and have them
stored when I save. I have included below what I think is relevant, I
am beyond just hints at this point, I need help with the code itself -
just cant get it to work. THANK YOU THANK YOU if you can help
-------PRACTICE MODEL-------
class Practice < ActiveRecord::Base
attr_accessible :name, :tax_id, :location_ids, :employee_ids,
:system_ids
has_and_belongs_to_many :employees
has_and_belongs_to_many :locations
has_many :implementations
has_many :systems, :through => :implementations
validates_presence_of :name, :tax_id
end
-----SYSTEM MODEL-------
class System < ActiveRecord::Base
attr_accessible :system_publisher, :system_name, :system_type,
:system_version,
:system_version_certified, :practice_ids
has_many :implementations
has_many :practices, :through => :implementations
end
-----IMPLEMENTATION MODEL-----
class Implementation < ActiveRecord::Base
attr_accessible :system_start_date, :system_stop_date,
:system_implemented_by, :system_ids, :practice_ids
belongs_to :system
belongs_to :practice
end
----PRACTICE CONTROLLER----
class PracticesController < ApplicationController
#added for auto complete text (HABTM)
#auto_complete_for :location, :name
#auto_complete_for :employee, :first_name
def index
@practices =
Practice.name_like_all(params[:search].to_s.split).ascend_by_name
#@practices = Practice.all
end
def show
@practice = Practice.find(params[:id])
end
def new
@practice = Practice.new
end
def create
@practice = Practice.new(params[:practice])
if @practice.save
flash[:notice] = "Successfully created practice."
redirect_to @practice
else
render :action => 'new'
end
end
def edit
@practice = Practice.find(params[:id])
end
def update
params[:practice][:employee_ids] ||= []
params[:practice][:location_ids] ||= []
#?
params[:practice][:system_ids] ||= []
#?
@practice = Practice.find(params[:id])
if @practice.update_attributes(params[:practice])
flash[:notice] = "Successfully updated practice."
redirect_to @practice
else
render :action => 'edit'
end
end
def destroy
@practice = Practice.find(params[:id])
@practice.destroy
flash[:notice] = “Successfully destroyed practice.”
redirect_to practices_url
end
end
PRACTICE _form
<% form_for @practice do |f| %>
<%= f.error_messages %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :tax_id %>
<%= f.text_field :tax_id %>
Employee(s): <% for employee in Employee.find(:all) %>
Location(s): <% for location in Location.find(:all) %>
<% for system in System.find(:all) %>
<%= f.submit %>
<% end %>