Forum: Ruby on Rails Insert key/value pair into hash, then read it out

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
460ead051b49c0b2a8e45e46252d4bda?d=identicon&s=25 Tom Ha (tom)
on 2008-11-06 21:28
Hi there,

I've been trying to figure out if/how the following is possible...

@books: array of books

@books.each do |book|
  do stuff...
  do stuff...
  do stuff...
  book["number_of_pages"] = 123   #this is supposed to "inject" the
key/value pair
end

I want to:
==========

-> "inject" the key 'number_of_pages' with the value '123' into the hash
"book" ("book" IS a hash, right?), for every book in @books

-> Then, show in the view: All "Number of pages":  <%= @books.collect
{|b| [b.number_of_pages] } %>

It doesn't work like this... (-> "undefined method `number_of_pages' for
#<Book:0xb5c022bc>")

How can I solve it...?

Many thanks for your help!
Tom
460ead051b49c0b2a8e45e46252d4bda?d=identicon&s=25 Tom Ha (tom)
on 2008-11-07 11:52
... anybody ... ?
Fb1a6916e06f221b5b53a6665f9858eb?d=identicon&s=25 Mikel Lindsaar (Guest)
on 2008-11-07 12:08
(Received via mailing list)
On Fri, Nov 7, 2008 at 7:28 AM, Tom Ha
<rails-mailing-list@andreas-s.net>wrote:

> @books: array of books
>  @books.each do |book|
>  do stuff...
>  do stuff...
>  do stuff...
>  book["number_of_pages"] = 123   #this is supposed to "inject" the
> key/value pair
> end




> -> "inject" the key 'number_of_pages' with the value '123' into the hash
> "book" ("book" IS a hash, right?), for every book in @books


No, book is a class, I assume at least.

Probably in your models directory you have a book.rb file that has

class Book < ActiveRecord::Base
<stuff>
end

-> Then, show in the view: All "Number of pages":  <%= @books.collect
> {|b| [b.number_of_pages] } %>
>
> It doesn't work like this... (-> "undefined method `number_of_pages' for
> #<Book:0xb5c022bc>")
>

You probably want a column called number_of_pages in your books table

Then you can do:
book.number_of_pages = 123
book.number_of_pages #=> 123

Hope that helps

Mikel

--
http://lindsaar.net/
Rails, RSpec and Life blog....
460ead051b49c0b2a8e45e46252d4bda?d=identicon&s=25 Tom Ha (tom)
on 2008-11-07 12:48
Thanks, Mikel. We're half way there, I guess:

> No, book is a class, I assume at least.
>
> Probably in your models directory you have a book.rb file that has
>
> class Book < ActiveRecord::Base
> <stuff>
> end

Yes, that's the case.

> You probably want a column called number_of_pages in your books table
>
> Then you can do:
> book.number_of_pages = 123
> book.number_of_pages #=> 123

Not really. Actually, I don't want to store the "number_of_pages" in a
database, I'd just lik to add it "on the fly" to each "book" to be able
to display it in the view, for each "book".

Is this possible in my case?
F2d6c742a86c801856006fae167ba1f2?d=identicon&s=25 George Bailey (Guest)
on 2008-11-07 13:08
(Received via mailing list)
On Nov 7, 2008, at 5:48 AM, Tom Ha wrote:

>
> able
> to display it in the view, for each "book".
>
> Is this possible in my case?



If you add these to the class:

def calc_number_of_pages
   @page_count = (your code to determine page count)
end

def number_of_pages
   @page_count
end


Then you can do:

@books.each do |book|
  book.calc_number_of_pages
end

Then in your view you can have

<%= book.number_of_pages %>

and it will do what you've described.
460ead051b49c0b2a8e45e46252d4bda?d=identicon&s=25 Tom Ha (tom)
on 2008-11-07 13:11
Great, thanks a lot!
This topic is locked and can not be replied to.