Undefined method 'each'

I am following along in Ben Scofield's book (Practical REST on Rails 2 Projects). As I was building the MovieList application, I ran into an undefined method for each, which I can't figure out how to debug (I am new to ruby/rails).

Can someone point me in the correct direction on how to debug this issue?

NoMethodError in MoviesController#update

undefined method `each' for #<Role:0x56ea30c>

RAILS_ROOT: E:/study/rails/movielist

Application Trace<http://localhost:3000/movies/1> | Framework Trace<http://localhost:3000/movies/1> | Full Trace<http://localhost:3000/movies/1>

E:/bin/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/attribute_methods.rb:256:in `method_missing'

app/models/movie.rb:17:in `deleted_roles='

app/controllers/movies_controller.rb:70:in `update'

app/controllers/movies_controller.rb:69:in `update'

movies_controller.rb:

65 def update

66 @movie = Movie.find(params[:id])

67 debugger

68

69 respond_to do |format|

70 if @movie.update_attributes(params[:movie])

71 flash[:notice] = 'Movie was successfully updated.'

72 format.html { redirect_to(@movie) }

73 format.xml { head :ok }

74 else

75 format.html { render :action => "edit" }

76 format.xml { render :xml => @movie.errors, :status => :unprocessable_entity }

77 end

78 end

79 end

Movies.rb:

16 def deleted_roles=(values)

17 roles.find(*values).each(&:destroy)

18 end

Role.rb:

class Role < ActiveRecord::Base
  belongs_to :movie
  belongs_to :person

  validates_presence_of :movie_id, :person_id, :name

  def to_s
    [person.full_name, name].join(' - ')
  end
end

Hi Joshua,

Joshua Ball wrote:

NoMethodError in MoviesController#update

undefined method `each' for #<Role:0x56ea30c>

You should post this question to the Rails list at
rubyonrails-talk@googlegroups.com When you do, you'll need to provide some
additional info.

Best regards,
Bill

Hi.

Note that #deleted_roles= is a setter method (you can tell by the equality
sign) and that in the update method you are assigning to this method.

You probably need to look into attr_accessible to make a whitelist of all
setters you want to be mass-assignable during #update and #create on your
controller (a mass-assignable attribute is one that you can safely assign
values to without worry -- an example of something you wouldn't want to mass
assign is an the primary key value).

James

···

On Mon, Nov 17, 2008 at 1:37 PM, Joshua Ball <Joshua.Ball@microsoft.com>wrote:

I am following along in Ben Scofield's book (Practical REST on Rails 2
Projects). As I was building the MovieList application, I ran into an
undefined method for each, which I can't figure out how to debug (I am new
to ruby/rails).

Can someone point me in the correct direction on how to debug this issue?

NoMethodError in MoviesController#update

undefined method `each' for #<Role:0x56ea30c>

RAILS_ROOT: E:/study/rails/movielist

Application Trace<http://localhost:3000/movies/1&gt; | Framework Trace<
http://localhost:3000/movies/1&gt; | Full Trace<
http://localhost:3000/movies/1&gt;

E:/bin/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/attribute_methods.rb:256:in
`method_missing'

app/models/movie.rb:17:in `deleted_roles='

app/controllers/movies_controller.rb:70:in `update'

app/controllers/movies_controller.rb:69:in `update'

movies_controller.rb:

65 def update

66 @movie = Movie.find(params[:id])

67 debugger

68

69 respond_to do |format|

70 if @movie.update_attributes(params[:movie])

71 flash[:notice] = 'Movie was successfully updated.'

72 format.html { redirect_to(@movie) }

73 format.xml { head :ok }

74 else

75 format.html { render :action => "edit" }

76 format.xml { render :xml => @movie.errors, :status =>
:unprocessable_entity }

77 end

78 end

79 end

Movies.rb:

16 def deleted_roles=(values)

17 roles.find(*values).each(&:destroy)

18 end

Role.rb:

class Role < ActiveRecord::Base
belongs_to :movie
belongs_to :person

validates_presence_of :movie_id, :person_id, :name

def to_s
   [person.full_name, name].join(' - ')
end
end