Total beginner asks a few questions

Hi there,

I am doing the "depot" application from Agile Web Development With Rails book - and there is a lot of copy-and-paste. And I have to say, as a beginner in both Ruby and Rails, I don't understand quite a lot of things.

Let's talk about this thing - there is a method called "add_to_cart". I don't understand much, what it's doing... (it's in class StoreController < ApplicationController)

  def add_to_cart     product = Product.find(params[:id])     @cart = find_cart     @cart.add_product(product)     redirect_to(:action => 'display_cart')   end

So, I have a few questions.

1) what exactly is product? Why it's not @product? Is it global or local variable? 2) what exactly is Product? I'm not sure, but I think its the only instance of Product class, right? Then why is the name of instance and name of the class the same? 3) What exactly is this params thing? 4) what exactly is :id? I don't understand, in which cases you use colon and in which not - why I have to use it in Product.find, but not in add_product? 5) what exactly does => mean? Why I can't use ordinary = ?

Sorry if I ask too much, I just want to understand this language and this framework.

Kaja Bilek

running idiot wrote:

Hi there,

I am doing the "depot" application from Agile Web Development With Rails book - and there is a lot of copy-and-paste. And I have to say, as a beginner in both Ruby and Rails, I don't understand quite a lot of things.

Let's talk about this thing - there is a method called "add_to_cart". I don't understand much, what it's doing... (it's in class StoreController < ApplicationController)

  def add_to_cart     product = Product.find(params[:id])     @cart = find_cart     @cart.add_product(product)     redirect_to(:action => 'display_cart')   end

So, I have a few questions.

1) what exactly is product? Why it's not @product? Is it global or local variable?

product is a local variable used to store the result of Product.find(...)

2) what exactly is Product? I'm not sure, but I think its the only instance of Product class, right? Then why is the name of instance and name of the class the same?   

Product.find(...) is calling the 'Product' _class_ method 'find' - it's not an instance

3) What exactly is this params thing?   

params is the parameter hash passed when the request is made, e.g. when you submit a form your data comes in through params - ditto when you make a GET request via an URL (/user/23 for example)

4) what exactly is :id? I don't understand, in which cases you use colon and in which not - why I have to use it in Product.find, but not in add_product?   

the preceding colon signifies a symbol - there's some good info on ruby symbols here => http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols && here => The Ruby_Newbie Guide to Symbols

5) what exactly does => mean? Why I can't use ordinary = ?   

key=>value, pretty common across different languages

Sorry if I ask too much, I just want to understand this language and this framework.

perhaps have a look @ http://pine.fm/LearnToProgram/ - a tasty little morsel that should help - not the most comprehensive answer but it's 2am and i've been dipping the whiskey :stuck_out_tongue:

I am also new and was getting a little lost (although I've learned a tremendous amount) with local variables and things that I percieved as variables.

So when does product refer to my product model? And what exactly is the difference between the local variable w/ @ and without. I thought there weren't a whole lot of variables without the @.

jamesdylangoldstein@gmail.com wrote:

I am also new and was getting a little lost (although I've learned a tremendous amount) with local variables and things that I percieved as variables.

So when does product refer to my product model? And what exactly is the difference between the local variable w/ @ and without. I thought there weren't a whole lot of variables without the @.

If I remember correctly, the convention is that the class name starts with a capital letter. So, Product is a class and product is the object. If you find that confusing, you could do things as you might in other languages: my_product = Product.find(product_id) but this looks ugly once you get used to the other notation :slight_smile:

A local variable without the @ is simply that - a variable local to the specific method in your controller. With the '@', it is an instance variable. Without going into the meanings of instance variables, the "Rails" meaning (not the Ruby one) for the variable is that it can be seen by code in both the controller and the view.

So, a temporary variable in a method in your controller would be without a '@' - any variable which you would like to display in the view must be an instance variable.

If we look at the code in the original post,

  def add_to_cart      product = Product.find(params[:id])      @cart = find_cart      @cart.add_product(product)      redirect_to(:action => 'display_cart')    end

we can see that the details of the product that you find do not need to be displayed in the view. But, the cart details must be shown in that view. That's why product (without @) and @cart (with @).

Lastly, params (though you didn't ask) is a hash that communicates parameters from to an action. Think of it as input parameters to the controller's method.

In summary, the controller method picks up the inputs from the params hash, processes it in local variables (without @) and writes its output to instance variables (with @). The view that is rendered as a result of the action reads values from the instance variables of the controller method and uses those values for rendering the output. When the user interacts with the view and clicks on something, it will send a request to a controller armed with relevant parameters (like the values of fields entered in a form) stored in the params hash - Full Circle! :slight_smile:

Hope this helps. Cheers Mohit.

Hi Kaja,

I'd just like to say that if you're a total beginner, copying and pasting is not what you should be doing. The best thing to do is to manually type out the examples as you read them. Why? Because you WILL make mistakes, and by making them, you must learn how to fix them to continue. You'll learn a lot more a lot faster if you do this.

Skimming a book and pasting examples isn't a good way to learn. Get your hands dirty! Making mistakes is a great way to learn :slight_smile:

Cheers! OJ

Ok, great post. The only other question I have, so I go to my Product class and find is inside a method. But I don't think it's refering to that. It's a universal method that rails auto-creates?

jamesdylangoldstein@gmail.com wrote:

Ok, great post. The only other question I have, so I go to my Product class and find is inside a method. But I don't think it's refering to that. It's a universal method that rails auto-creates?

Thanks. Find is a part of the ActiveRecord class. Note that your Product class inherits from the ActiveRecord (remember the first line of the model file was:     class Product < ActiveRecord::Base

ActiveRecord does the Object-Relational mapping (ORM) from a database row to the object. Check out: Peak Obsession (not just the anchor, the whole page) for much more information about ActiveRecord.

Cheers Mohit.

Ok so... in your view on your add to cart button you have this code :action => :add_to_cart, :id => product, this calls the add_to_cart method and the id it gives is the products id. Now in the add_to_cart Product.find(params[:id]), first the params[:id] gets the id of the product you submited because of the code on your add to cart button in view. so if you submited product with id=1 your Product.find will be Product.find(1) and so on, this params[:id] is to see what id to put in . If you still dont understand ill try to explain it more. So this code searches for product with id you submited.

Then you have @cart = find_cart this makes a variable with your session because in your find_cart method you created a new session that stores your products in cart

Then @cart.add_product(product) this calls the add_to_product method in cart.rb.

Btw. I had the same problems when i was reading that part...Btw. youll probably have problems with cartitem later to figure out how thigs work...

I hope i helped a little.

P.S Sorry for my bad english...