Error of undefined method

def index

@users= User.all
@pic= []

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.

because i want to take a value “image” from Picture model
what can i do … I am really stuck now…

thanks

Joanne

  1. Remove the send_data line, it isn’t required.
    Yes, it did remove it.
  1. Can you check if there are any records in your pictures table? Right now it looks like it is returning nil.

Yes, It has 1 record in Picture table and 3 records in User Table

I think it might be a good idea for you to work through some Rails
tutorials to understand the basics of Rails. The free-to-use-online
tutorial railstutorial.org is good. It might seem that the tutorial
does not lead to the application that you want to develop but if you
work right through it you will learn a vast amount and will then be
embarrassed to look back here at the questions you were asking :slight_smile:

Also take a good look at the Rails Guides. I mean a *good* look do
not just skim through them. Again you will learn a lot and the time
spent will be saved many times over.

Colin

Not sure why it errors out now.

Do you get the same error is it a different error this time?

Not sure why it errors out now.
Do you get the same error is it a different error this time?

this is my index

def index
@user= Users.all
@pictograph = []

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

@pic.compact!
 end

end

and my view is

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

my error:
Processing by UsersController#index as
User Load (1.0ms) SELECT “users”.* FROM “users” WHERE “users”.“id” = 1 LIMIT 1
PictureLoad (7.0ms) SELECT “pictures”.* FROM “pictures” WHERE “pictures”.“phrase_id” = ‘route’ AND “pictures”.“culturet_id” = 1 LIMIT 1

Completed in 237ms

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/users_controller.rb:27:in `block in index’

app/controllers/users_controller.rb:25:in each' app/controllers/users_controller.rb:25:in index’

Oh, so you are trying to get the image url from the user’s index action?

If yes, that’s not correct.

You should instead have a different method name and should request for image url of only one specific user.

It would help in cleaning up the code and solve this issue faster, if you can tell me what exactly you are trying to do.

Oh, so you are trying to get the image url from the user’s index action?

If yes, that’s not correct.

yes, i am trying to get image url from db

You should instead have a different method name and should request for image url of only one specific user.

I have def show to get specific user

def show
@user= User.find_by_id(params[:id])

end

It would help in cleaning up the code and solve this issue faster, if you can tell me what exactly you are trying to do.

I want take a value image from Picture table with specific user and display it on the screen.
can u help me… thanks :X so much much…

Joanne

Ok, that’s clear now.

Do you use pastie (http://pastie.org/) or gist (https://gist.github.com/)?
If yes, can you paste following on any of them and reply with link?

#models

User

Picture

#controllers

UsersController

#views

users/index

Ok, that’s clear now.

Do you use pastie (http://pastie.org/) or gist (https://gist.github.com/)?

If yes, can you paste following on any of them and reply with link?

No, I am using that…

#models

User

id
name
address
culture_id

Picture

id
image(binary)
phrase_id
culture_id

Culture
id
phrase_id

#controllers

UsersController

def index
@user= User.all
@pic= []
@user.each do |p|
@pic<< Picture.where(:phrase_id => :route , :culture_id => p.culture_id).first

 @pic.compact!

 end

end

def show
@user= User.find_by_id(params[:id])
end

end

#views

users/index

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

Ok, that’s clear now.

Do you use pastie (http://pastie.org/) or gist (https://gist.github.com/)?

If yes, can you paste following on any of them and reply with link?

No, I am using that…

#models

User

id
name
address
culture_id

Picture

id
image(binary)
phrase_id
culture_id

Culture
id
phrase_id

#controllers

UsersController

def index
@user= User.all
@pic= []
@user.each do |p|
@pic<< Picture.where(:phrase_id => :route , :culture_id => p.culture_id).first

 @pic.compact!

 end

end

def show
@user= User.find_by_id(params[:id])
end

end

#views

users/index

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

Oh, so you are trying to get the image url from the user’s index action?

If yes, that’s not correct.

yes, i am trying to get image url from db

You should instead have a different method name and should request for image url of only one specific user.

I have def show to get specific user

def show
@user= User.find_by_id(params[:id])

end

It would help in cleaning up the code and solve this issue faster, if you can tell me what exactly you are trying to do.

I want take a value image from Picture table with specific user and display it on the screen.
can u help me… thanks :X so much much…

Joanne

Not sure why it errors out now.
Do you get the same error is it a different error this time?

this is my index

def index
@user= Users.all
@pictograph = []

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






@pic.compact!
 end

end

and my view is

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

my error:
Processing by UsersController#index as
User Load (1.0ms) SELECT “users”.* FROM “users” WHERE “users”.“id” = 1 LIMIT 1
PictureLoad (7.0ms) SELECT “pictures”.* FROM “pictures” WHERE “pictures”.“phrase_id” = ‘route’ AND “pictures”.“culturet_id” = 1 LIMIT 1

Completed in 237ms

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/users_controller.rb:27:in `block in index’

app/controllers/users_controller.rb:25:in each' app/controllers/users_controller.rb:25:in index’

  1. Remove the send_data line, it isn’t required.
    Yes, it did remove it.
  1. Can you check if there are any records in your pictures table? Right now it looks like it is returning nil.

Yes, It has 1 record in Picture table and 3 records in User Table

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.

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.

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.

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.

Thank you,

Yen

Ok, that’s clear now.

Do you use pastie (http://pastie.org/) or gist (https://gist.github.com/)?

If yes, can you paste following on any of them and reply with link?

No, I am not using that…

#models

User

id
name
address
culture_id

Picture

id
image(binary)
phrase_id
culture_id

Culture
id
phrase_id

#controllers

UsersController

def index
@user= User.all
@pic= []
@user.each do |p|
@pic<< Picture.where(:phrase_id => :route , :culture_id => p.culture_id).first

 @pic.compact!

 end

end

def show
@user= User.find_by_id(params[:id])
end

end

#views

users/index

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

Ok, some more questions:

  1. So, you want to display an image of the culture associated with the user, right?

  2. How are you uploading pictures to your database?

Ok, some more questions:

  1. So, you want to display an image of the culture associated with the user, right?

yes

  1. How are you uploading pictures to your database?

right now, i just using the sqlite manager to upload the blob.

Getting pretty late here, heading to bed. We can work on a cleaner solution tomorrow or others on the forum can help.

For now, this quick and dirty solution should work:

In your view

<% @users.each do |user| %>

<%= user.name %> <%= image_tag url_for(:controller => "users", :action => "culture_image, :culture_id => user.culture_id, :phrase_id => ""), :width => "25px", :height => "25px"%> <% end %>

Note that I haven’t put in a value for :phrase_id in the url, please substitute appropriate value there as required.

In your controller

def index
@user= User.all
end

def culture_image

picture = Picture.where(:phrase_id => params[:phrase_id], :culture_id => params[:culture_id]).limit(1)

if picture

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

else

 render :status => 404

end

end

Note that you may have to modify your routes to include the new method “culture_image”… something like this"

resources :users do

get :culture_image, :on => :collection

end

thanks you so much…
Joanne

Is it working now?

If not post the error and we’ll see how to get it to a good shape.