Mason Kessinger
2006-Apr-04 23:00 UTC
[Rails] newbie - HABTM problems writing to Join Table in SQL
I am attempting to document a join between two tables. There seems to be
no writing to my database. Please help me out it is driving me absolutly
crazy.
Basically i''ve got a table of directors that is called when the
new/edit
controller model for films is activated. It shows the user a selectable
list of directors they can apply to films. The problem is in the
update/create part. I cannot figure out what to write to make it update
my directors_films database table.
Thanks so much for whomever braves this problem... I promise to return
the favor to another seeking knowledge someday!
-----schema.rb-----
ActiveRecord::Schema.define() do
create_table "directors", :force => true do |t|
t.column "name", :string, :default => "na", :null
=> false
t.column "biography", :text, :default => "", :null
=> false
end
create_table "directors_films", :id => false, :force => true
do |t|
t.column "director_id", :integer, :default => 0, :null =>
false
t.column "film_id", :integer, :default => 0, :null => false
end
create_table "films", :force => true do |t|
t.column "title", :string, :default => "", :null
=> false
t.column "release_date", :date, :null => false
end
end
------director.rb-----
class Director < ActiveRecord::Base
has_and_belongs_to_many :films
end
------film.rb-------
class Film < ActiveRecord::Base
has_and_belongs_to_many :directors
end
--------application_helper.rb---------
module ApplicationHelper
def director_dropdown
select(:director, :id, Director.find(:all, :order => "name").map
{|d|
[d.name, d.director_id] })
end
end
--------films/form.rhtml-----------
<p><label for="film_title">Title</label><br/>
<%= text_field ''film'', ''title''
%><br/>
Director<br/>
<%= director_dropdown %>
</p>
<p><label for="film_release_date">Release
date</label><br/>
<%= date_select ''film'', ''release_date'',
:order => [:day, :month, :year],
:start_year => 1900 %></p>
--------films_controller----------
class FilmsController < ApplicationController
def index
list
render :action => ''list''
end
# GETs should be safe (see
http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list }
def list
@film_pages, @films = paginate :films, :per_page => 10
end
def show
@film = Film.find(params[:id])
end
def new
@film = Film.new
@directors = Director.find_all
end
def create
@film = Film.new(params[:film])
if @film.save
flash[:notice] = ''Film was successfully created.''
redirect_to :action => ''list''
else
render :action => ''new''
end
end
def edit
@film = Film.find(params[:id])
@directors = Director.find_all
end
def update
@film = Film.find(@params[:id])
if @film.update_attributes(params[:film])
flash[:notice] = ''Film was successfully updated.''
redirect_to :action => ''show'', :id => @film
else
render :action => ''edit''
end
end
def destroy
Film.find(params[:id]).destroy
redirect_to :action => ''list''
end
end
--
Posted via http://www.ruby-forum.com/.
Adam Bloom
2006-Apr-05 04:59 UTC
[Rails] Re: newbie - HABTM problems writing to Join Table in SQL
> def create > @film = Film.new(params[:film])After this line you will (I think) want: @film.directors = Director.find(params[:id]) you might need: @film.directors = Director.find(params[:director][:id]) but I don''t think so.> if @film.save > flash[:notice] = ''Film was successfully created.'' > redirect_to :action => ''list'' > else > render :action => ''new'' > end > end-- Posted via http://www.ruby-forum.com/.
Mason Kessinger
2006-Apr-05 13:14 UTC
[Rails] Re: newbie - HABTM problems writing to Join Table in SQL
I have tried similar to this, but have had no successes. What I get in
response is this:
---
ActiveRecord::RecordNotFound in Films#create
Couldn''t find Director without an ID
RAILS_ROOT: script/../config/..
Application Trace | Framework Trace | Full Trace
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.0/lib/active_record/base.rb:939:in
`find_from_ids''
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.0/lib/active_record/base.rb:382:in
`find''
#{RAILS_ROOT}/app/controllers/films_controller.rb:26:in `create''
Request
Parameters: {"director"=>{"id"=>"1"},
"commit"=>"Create",
"film"=>{"image_url"=>"na",
"crew"=>"", "title"=>"",
"commentary"=>"",
"film_url"=>"na",
"release_date(1i)"=>"2006",
"video_url"=>"na",
"release_date(2i)"=>"4",
"release_date(3i)"=>"5",
"distributor"=>"na",
"cast"=>"", "synopsis"=>""}}
Show session dump
Response
Headers: {"cookie"=>[],
"Cache-Control"=>"no-cache"}
---
Could you explain what this means?
--
Posted via http://www.ruby-forum.com/.
Adam Bloom
2006-Apr-05 16:26 UTC
[Rails] Re: newbie - HABTM problems writing to Join Table in SQL
> ActiveRecord::RecordNotFound in Films#create > > Couldn''t find Director without an ID > RAILS_ROOT: script/../config/..> > Parameters: {"director"=>{"id"=>"1"}, "commit"=>"Create", > "film"=>{"image_url"=>"na", "crew"=>"", "title"=>"", "commentary"=>"", > "film_url"=>"na", "release_date(1i)"=>"2006", "video_url"=>"na", > "release_date(2i)"=>"4", "release_date(3i)"=>"5", "distributor"=>"na", > "cast"=>"", "synopsis"=>""}} > > Show session dump > > Response > > Headers: {"cookie"=>[], "Cache-Control"=>"no-cache"} > > --- > > Could you explain what this means?The error, which I assume is on this line: @film.directors = Director.find(params[:director][:id]) means that it''s trying to run find without having an :id parameter. Which is odd because as you see from this:> Parameters: {"director"=>{"id"=>"1"}, "commit"=>"Create", > "film"=>{"image_url"=>"na", "crew"=>"", "title"=>"", "commentary"=>"", > "film_url"=>"na", "release_date(1i)"=>"2006", "video_url"=>"na", > "release_date(2i)"=>"4", "release_date(3i)"=>"5", "distributor"=>"na", > "cast"=>"", "synopsis"=>""}}Specifically, the part "director"=>{"id"=>"1"} Indicates that the id should be accessible by [:director][:id]. I think. :P You might try it again to make sure there were no small syntax mistakes. In the mean time, anyone know what I''m missing? :) -Adam -- Posted via http://www.ruby-forum.com/.