Push_with_attributes for a has_many_through

I’m basing feeds/show.rhtml and feeds_controller.rb on

Chapter 12 - More Model Magic
Ruby on Rails For Dummies
by Barry B.
John Wiley & Sons © 2007

specifically listings 12-12 and 12-14. Of course, it’s now deprecated
:frowning:

There’s a has_many_through between the “feeds” and “tags” tables. The
join table is “colors”, for lack of a better name. I believe that the
name of the join table and that it’s a has_many_through are causing the
error message.

I have a screen shot at Google Code Archive - Long-term storage for Google Code Project Hosting. , just click on
the add_a_tag.png. Up to that point, everything works. However, when I
click on the button I get the following error:

NoMethodError in FeedsController#add_some_tags

undefined method `push_with_attributes’ for Tag:Class

RAILS_ROOT: ./script/…/config/…
Application Trace | Framework Trace | Full Trace

/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
base.rb:1238:in method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/ associations/has_many_through_association.rb:120:in send’
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
associations/has_many_through_association.rb:120:in method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/ base.rb:946:in with_scope’
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
associations/has_many_through_association.rb:120:in method_missing' /home/thufir/Desktop/strawr/app/controllers/feeds_controller.rb:88:in add_some_tags’
/home/thufir/Desktop/strawr/app/controllers/feeds_controller.rb:87:in
each' /home/thufir/Desktop/strawr/app/controllers/feeds_controller.rb:87:in add_some_tags’

/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
base.rb:1238:in method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/ associations/has_many_through_association.rb:120:in send’
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
associations/has_many_through_association.rb:120:in method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/ base.rb:946:in with_scope’
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
associations/has_many_through_association.rb:120:in method_missing' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ base.rb:1101:in send’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
base.rb:1101:in perform_action_without_filters' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ filters.rb:696:in call_filters’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
filters.rb:688:in perform_action_without_benchmark' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ benchmarking.rb:66:in perform_action_without_rescue’
/usr/lib/ruby/1.8/benchmark.rb:293:in measure' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ benchmarking.rb:66:in perform_action_without_rescue’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
rescue.rb:83:in perform_action' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ base.rb:435:in send’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
base.rb:435:in process_without_filters' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ filters.rb:684:in process_without_session_management_support’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
session_management.rb:114:in process' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ base.rb:334:in process’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/dispatcher.rb:41:in
dispatch' /usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/webrick_server.rb:113:in handle_dispatch’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/webrick_server.rb:79:in
service' /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in service’
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in run' /usr/lib/ruby/1.8/webrick/server.rb:173:in start_thread’
/usr/lib/ruby/1.8/webrick/server.rb:162:in start' /usr/lib/ruby/1.8/webrick/server.rb:162:in start_thread’
/usr/lib/ruby/1.8/webrick/server.rb:95:in start' /usr/lib/ruby/1.8/webrick/server.rb:92:in each’
/usr/lib/ruby/1.8/webrick/server.rb:92:in start' /usr/lib/ruby/1.8/webrick/server.rb:23:in start’
/usr/lib/ruby/1.8/webrick/server.rb:82:in start' /usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/webrick_server.rb:63:in dispatch’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/commands/servers/webrick.rb:59
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
gem_original_require' /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in require’
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/
dependencies.rb:495:in require' /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/ dependencies.rb:342:in new_constants_in’
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/
dependencies.rb:495:in require' /usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/commands/server.rb:39 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in gem_original_require’
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require’
script/server:3

/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
base.rb:1238:in method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/ associations/has_many_through_association.rb:120:in send’
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
associations/has_many_through_association.rb:120:in method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/ base.rb:946:in with_scope’
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/active_record/
associations/has_many_through_association.rb:120:in method_missing' /home/thufir/Desktop/strawr/app/controllers/feeds_controller.rb:88:in add_some_tags’
/home/thufir/Desktop/strawr/app/controllers/feeds_controller.rb:87:in
each' /home/thufir/Desktop/strawr/app/controllers/feeds_controller.rb:87:in add_some_tags’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
base.rb:1101:in send' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ base.rb:1101:in perform_action_without_filters’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
filters.rb:696:in call_filters' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ filters.rb:688:in perform_action_without_benchmark’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
benchmarking.rb:66:in perform_action_without_rescue' /usr/lib/ruby/1.8/benchmark.rb:293:in measure’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
benchmarking.rb:66:in perform_action_without_rescue' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ rescue.rb:83:in perform_action’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
base.rb:435:in send' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ base.rb:435:in process_without_filters’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
filters.rb:684:in process_without_session_management_support' /usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/ session_management.rb:114:in process’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/
base.rb:334:in process' /usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/dispatcher.rb:41:in dispatch’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/webrick_server.rb:113:in
handle_dispatch' /usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/webrick_server.rb:79:in service’
/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in service' /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in run’
/usr/lib/ruby/1.8/webrick/server.rb:173:in start_thread' /usr/lib/ruby/1.8/webrick/server.rb:162:in start’
/usr/lib/ruby/1.8/webrick/server.rb:162:in start_thread' /usr/lib/ruby/1.8/webrick/server.rb:95:in start’
/usr/lib/ruby/1.8/webrick/server.rb:92:in each' /usr/lib/ruby/1.8/webrick/server.rb:92:in start’
/usr/lib/ruby/1.8/webrick/server.rb:23:in start' /usr/lib/ruby/1.8/webrick/server.rb:82:in start’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/webrick_server.rb:63:in
dispatch' /usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/commands/servers/webrick.rb:59 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in gem_original_require’
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in require' /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/ dependencies.rb:495:in require’
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/
dependencies.rb:342:in new_constants_in' /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/ dependencies.rb:495:in require’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/commands/server.rb:39
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
gem_original_require' /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in require’
script/server:3

Request

Parameters: {“tag1”=>{“checked”=>“0”}, “commit”=>“Save changes”,
“tag2”=>
{“checked”=>“0”}, “tag3”=>{“checked”=>“1”}, “id”=>“4”}

Show session dump


flash: !map:ActionController::Flash::FlashHash {}

Response
Headers: {“cookie”=>[], “Cache-Control”=>“no-cache”}

The relevant code:

thufir@arrakis ~/Desktop/strawr $
thufir@arrakis ~/Desktop/strawr $ cat
app/controllers/feeds_controller.rb
class FeedsController < 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
@feed_pages, @feeds = paginate :feeds, :per_page => 10
end

def show
@feed = Feed.find(params[:id])
end

def new
@feed = Feed.new
@tag = Tag.find_all
end

def create
@feed = Feed.new(params[:feed])
if @feed.save
flash[:notice] = ‘Feed was successfully created.’
redirect_to :action => ‘list’
else
render :action => ‘new’
end
end

def edit
@feed = Feed.find(params[:id])
@tag = Tag.find_all
end

def update
@feed = Feed.find(params[:id])
if @feed.update_attributes(params[:feed])
flash[:notice] = ‘Feed was successfully updated.’
redirect_to :action => ‘show’, :id => @feed
else
render :action => ‘edit’
end
end

def destroy
Feed.find(params[:id]).destroy
redirect_to :action => ‘list’
end

#courtesy of Listing 12-12
#of Ruby on Rails For Dummies

def remove_tag
@feed = Feed.find(params[:id])
@feed.tags.delete(
Tag.find(params[:which_tag]))

if @feed.save
flash[:notice] = ‘Tag has been removed.’
end
redirect_to :action => ‘show’, :id => @feed
end

def add_tag
@feed = Feed.find(params[:id])
@feed.tags.push_with_attributes(
Tag.find(params[:tag][:id]))

if @feed.save
flash[:notice] = ‘Tag has been added!’
end
redirect_to :action => ‘show’, :id => params[:id]
end

def add_some_tags
@feed = Feed.find(params[:id])
@unused_tags =
Tag.find(:all) - @feed.tags

if @unused_tags.any?
@tags_to_add = @unused_tags.select { |tag|
(@params[‘tag’+tag.id.to_s][‘checked’] == ‘1’)}
@tags_to_add.each { |tag|
@feed.tags.push_with_attributes(tag)}
end

if @tags_to_add.any? and @feed.save
flash[:notice] = ‘Tags have been added!’
end
redirect_to :action => ‘show’, :id => @feed
end

end
thufir@arrakis ~/Desktop/strawr $
thufir@arrakis ~/Desktop/strawr $ cat app/views/feeds/show.rhtml
<% for column in Feed.content_columns %>

<%= column.human_name %>: <%=h @feed.send(column.name) %>

<% end %>

<%= link_to ‘Edit’, :action => ‘edit’, :id => @feed %> |
<%= link_to ‘Back’, :action => ‘list’ %>

<% for column in Feed.content_columns %>

<%= column.human_name %>: <%=h @feed.send(column.name) %>

<% end %>

Tags:

<% if @feed.tags.empty? %>
(None)


<% else %>
<% for tag in @feed.tags %>
<%= tag.name %> 
<%= link_to ‘Remove’, { :action => ‘remove_tag’,
:id => @feed, :which_tag => tag.id },
:confirm => ‘Are you sure?’, :post => true %>


<% end %>
<% end %>

<% @unused_tags =
Tag.find(:all) - @feed.tags %>

<% if @unused_tags.any? %>

<%= form_tag :action => “add_some_tags”,
:id => @feed %>
Add a tag:

<% @unused_tags.each {|tag| %>
<%= check_box(‘tag’+tag.id.to_s, ‘checked’) +
tag.tag %>

<% } %>
<%= submit_tag %>
<%= end_form_tag %>
<% end %>

<%= link_to ‘Edit’, :action => ‘edit’, :id => @feed %> |
<%= link_to ‘Back’, :action => ‘list’ %>

thufir@arrakis ~/Desktop/strawr $

thanks,

Thufir