Error of undefined method

Hi all, I have very basic error that i have no idea how to show

I have user table
id
name
add
phone number

then i select all in user table
using => @users = User.all

=> @users.name

it gives me undefined method name Array<.....>

Please give me some advice..

Thanks

@users.all basically returns "array" of users

so you have to iterate through this array

@users.each do |user|
  puts user.name
end

tom

Hi!

The method User.all returns an Array of users, not a single user.

I think you have to iterate over the array, using each.

@users.each { |u| u.name }

Everaldo

thanks

I have other undefined method when i combine the code above together

<%@users = User.all%>
<%@users.each do |u|%>
<%u.culture_id%>

<% @pic= Picture.where(:phrase_id => :route , :culture_id => u.culture_id).first%>

My picture <%= @pic.image%>

and it causes undefined method image

please give me advices… thank you so much

Joanne

thanks

Hi!

The method User.all returns an Array of users, not a single user.

I think you have to iterate over the array, using each.

@users.each { |u| u.name }

Everaldo

Hi all, I have very basic error that i have no idea how to show

I have user table

id

name

add

phone number

then i select all in user table

using => @users = User.all

=> @users.name

it gives me undefined method name Array<…>

Please give me some advice…

Thanks

Joanne

What does it say has not got a method image? It is always a good idea
to post the complete error message (use copy/paste rather than
re-typing it). If it says the nil has not got the method then your
call of Picture.where has not found a record.

Colin

the error is undefined method `image’ for nil:NilClass

You don’t have an <% end %> to close the <% @users.each %> block in the code you included, so my guess is that your u variable is already out of scope by the time you call u.image.

Please don't top post, it makes it difficult to follow the thread.
Insert your reply at appropriate places in previous message. Thanks.

the error is undefined method `image' for nil:NilClass

So what does that mean (see my previous post)?

Colin

Hi,

Few things here:

  1. Would be good if you can paste full code from the beginning of the loop till the place where you render picture

  2. It is not a good practice to set instance variables in the views, set them in controller instead

  3. It is not a good practice to do finds in views, if you want to fetch a picture for the user, it’s better to define a relationship between picture and user models. And then do something like this in the controller - @users = User.includes(:picture).all

Hope this helps.

My controller:

def index
@users= User.all

@users.each do |p|   
@pic= Picture.where(:phrase_id => :route , :culture_id => p.culture_id).first
 send_data @pic.image, :type => 'image/gif', :disposition => 'inline'
end

end

in View

<%= image_tag url_for(:controller => "/users", :action => "index"), :width => "25px", :height => "25px"%>

<%@pic.each do |c|%>
<%= c.image%>
<% end %>

please give me some advices…

thanks
Joanne

My controller:

def index
@users= User.all

@users.each do |p|   

@pic= Picture.where(:phrase_id => :route , :culture_id => p.culture_id).first
 send_data @pic.image, :type => 'image/gif', :disposition => 'inline'

end

end

in View

<%= image_tag url_for(:controller => "/users", :action => "index"), :width => "25px", :height => "25px"%>

<%@pic.each do |c|%>
<%= c.image%>
<% end %>

error is
You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Extracted source (around line #79):

76:


77: <%= image_tag url_for(:controller => “/users”, :action => “index”), :width => “25px”, :height => “25px”%>

78:
79: <%@pic.each do |c|%>
80: <%= c.image%>
81: <% end %>
82:

Your index action should be something like this:

def index

@users= User.all

@pic = []

@users.each do |p|

@pic << Picture.where(:phrase_id => :route , :culture_id => p.culture_id).limit(1)

end

end

it does not work, it is complaining other error

NoMethodError (undefined method image' for [nil]:Array): app/controllers/patients_controller.rb:27:in block in index’
app/controllers/patients_controller.rb:25:in each' app/controllers/patients_controller.rb:25:in index’

Oh yes… sorry about that.

I assumed that you will find picture for every query.

You can try this instead:

def index

@users= User.all

@pic = []

@users.each do |p|

@pic << Picture.where(:phrase_id => :route , :culture_id => p.culture_id).limit(1)

end

@pic.compact!

end

by calling compact! on the array, we will eliminate all nil object.

On another note, are you sure, this is what you want to do? If you have 100 users, it will fire 100 sql queries which is not good.

Oh yes… sorry about that.
I assumed that you will find picture for every query.

You can try this instead:

def index

@users= User.all

@pic = []

@users.each do |p|

@pic << Picture.where(:phrase_id => :route , :culture_id => p.culture_id).limit(1)

end

@pic.compact!

end

by calling compact! on the array, we will eliminate all nil object.

On another note, are you sure, this is what you want to do? If you have 100 users, it will fire 100 sql queries which is not good.

Yes i think i have that problem as well because if i remove "@users.each do |p| "

and then it will cause undefined method of culture_id…
plus when i call @pic.compact! , it gives me

NoMethodError (You have a nil object when you didn’t expect it!
You might have expected an instance of Array.

The error occurred while evaluating nil.compact!):
app/controllers/patients_controller.rb:29:in `index’

what is mean? cuz i want to display picture on the browser too…

please help… thank you very much

Joanne

Can you paste what you have in your index method?

You should not be getting this error because we have already defined @pic as an empty array.

Can you paste what you have in your index method?
You should not be getting this error because we have already defined @pic as an empty array.

def index
@users= User.all
@pic= []

@users.each do |p|   
@pic<< Picture.where(:phrase_id => :route , :culture_id => p.culture_id).first

end

@pic.compact!

send_data @pic.image, :type => 'image/png', :disposition => 'inline'

end

Oh yes… sorry about that.
I assumed that you will find picture for every query.

You can try this instead:

def index

@users= User.all

@pic = []

@users.each do |p|

@pic << Picture.where(:phrase_id => :route , :culture_id => p.culture_id).limit(1)

end

@pic.compact!

end

by calling compact! on the array, we will eliminate all nil object.

On another note, are you sure, this is what you want to do? If you have 100 users, it will fire 100 sql queries which is not good.

Yes i think i have that problem as well because if i remove "@users.each do |p| "

and then it will cause undefined method of culture_id…
plus when i call @pic.compact! , it gives me

NoMethodError (You have a nil object when you didn’t expect it!
You might have expected an instance of Array.

The error occurred while evaluating nil.compact!):
app/controllers/patients_controller.rb:29:in `index’

what is mean? cuz i want to display picture on the browser too…

please help… thank you very much

Joanne

it does not work, it is complaining other error

NoMethodError (undefined method image' for [nil]:Array): app/controllers/patients_controller.rb:27:in block in index’
app/controllers/patients_controller.rb:25:in `each’

app/controllers/patients_controller.rb:25:in `index’

Your index action should be something like this:

def index

@users= User.all

@pic = []

@users.each do |p|

@pic << Picture.where(:phrase_id => :route , :culture_id => p.culture_id).limit(1)

end

end

You received this message because you are subscribed to the Google Groups “Ruby on Rails: Talk” group.

To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/B259TKI0970J.

To post to this group, send email to rubyonrails-talk@googlegroups.com.

To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Thank you,

Yen

You received this message because you are subscribed to the Google Groups “Ruby on Rails: Talk” group.

To post to this group, send email to rubyonrails-talk@googlegroups.com.

To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Chirag
http://sumeruonrails.com

You received this message because you are subscribed to the Google Groups “Ruby on Rails: Talk” group.

To post to this group, send email to rubyonrails-talk@googlegroups.com.

To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

You received this message because you are subscribed to the Google Groups “Ruby on Rails: Talk” group.

To post to this group, send email to rubyonrails-talk@googlegroups.com.

To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.


Chirag
http://sumeruonrails.com

You received this message because you are subscribed to the Google Groups “Ruby on Rails: Talk” group.

To post to this group, send email to rubyonrails-talk@googlegroups.com.

To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

You would probably have fewer problems if you observed the Rails
naming conventions; e.g.

@pictures = [] # plural

@users.each do |user|
     @pictures << Picture.where(:phrase_id => :route , :culture_id
=>user.culture_id).first
end

@pictures.compact!

Now it's obvious that the next line makes no sense:

      send_data @pictures.image, :type => 'image/png', :disposition
=> 'inline'

An *array* of pictures doesn't have an "image" attribute.

HTH,

  1. Remove the send_data line, it isn’t required.

  2. Can you check if there are any records in your pictures table? Right now it looks like it is returning nil.