Welcome to the Treehouse Community
The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.
Logan Bresnahan3,389 Points
Not totally understanding the special initialize method in Ruby. Do you have to use instance variables with initialize?
Can anyone break down the logic of initialize for me?
Hi Logan -
To clarify a couple things regarding your undestanding about the initialize method:
First, when you create a new object (i.e., student) you must pass in the two arguments (name & grade). In my example, the initialize method expects to receive the two arguments. Once you associate an argument with the initialize method, you can not leave it off. If you do, it will generate an error.
Second, this leads to my second point of clarification. You wrote: "...every time I create a new instance of "class Student" that new instance will initialize whatever is defined by my initialize method." Not exactly .... The important thing to grasp is that it is the initialize method (not the new instance object) that receives the arguments you pass in. When you pass in the two arguments you're delivering them to the initialize method, so it can do its thing.
Nick Fuller expanded on my example by showing how you can call other methods from your initialize method. His expansion illustrates a very good point. Now, you asked what happens if you don't "add 'random_classroom' and 'assign_homework' [additional methods] within the initialize method?" The short answer is nothing. You don't need to add any additional methods unless your business needs require them. Nick was just illustrating a very good point about calling other methods with the initialize method.
By the way, I thought assigning homework on the first day was pretty funny ... seems like my John Smart will have a taskmaster for a teacher. lol
Hope it's clearer for you now.
Nick Fuller9,027 Points
I think Ronald did a good job of answering your question, but I wanted to add 1 lil bit to it and that is you can call other methods from your initialize method. Let's build on the Student object that Ronald started.
class Student def initialize(name, grade) @name = name @grade = grade @classroom = random_classrom assign_homework end def random_classroom ['12A', '15B', '16C', '18A'].sample end def assign_homework @homework ||= Homework.last end end
Here we have set the students name and grade. But I'm also assigning the student to a random classroom (the sample method on the array class will randomly grab an element) and assigning them homework!
Does this make sense?
It's good to hear that the example and discussion helped you. It's also good that you did some independent reading on the subject. Treehouse courses are good, but it's important to research things from other sources too. I try to routinely look at as many different resources as I can lay my hands & eyes on (i.e., books, websites, tech forums, You-Tube videos, Coursera, etc.). After reviewing multiple sources, something that at first may have been cloudy, becomes clearer. Everyone has a different learning style, but that approach works best for me.
Here's a few tips that have helped me as I've traveled along the Rails Track. These strategies may also be of use to you.
First, try to learn as much Ruby as you can before tackling Rails. Some people may say it's not necessary to really grasp Ruby before tackling Rails, but I believe that having a decent handle on Ruby helps one to understand what's going on in Rails. Rails is like magic in many ways. It "hides" a lot of details behind the "curtain." It's great for getting stuff done, but it's possible to get something "done" in Rails without really understanding what you're doing. It's sort of like driving an automatic car without knowing how the transmission or engine works. So, I've tried my best to build up my understanding of Ruby to enhance my understanding of Rails. Hope that makes sense. My goal is to realy grasp what's going on under the Rails "hood." I think of Ruby as the key to unlock my Rails car (i.e., app).
Second, I've found that having a basic understanding of databases (MySQL) has helped me to better wrap my mind around Rails. Andew Chalkley's (Treehouse's) Database Foundations course is a good basic primer on the subject. After taking Andrew's course, I have a better understandng of and appreciation for the "magic", brilliance, and yes, beauty of ActiveRecord (the model) in Rails. The pieces began to make better sense.
Like you, Logan, I'm just learning new stuff and trying my best to understand it all. It's a bit overwhelming sometimes, but I try it step by step. A little each day adds up!
My last tip based on my experience so far: Be sure to give your brain proper rest! After I've rested, the fog almost always seem to lift. It's amazing how the human brain works! Whenever I get stuck (and that's often for me :-) I just look for new and different resources to enhance my understanding. Eventually it clicks.
Hope these tips are useful to you. Keep going! Good luck in your journey, wherever it may lead you.
The initialize method allows you to pass arguments to a new object when you create it. For example, say you have the following
class Student def initialize(name, grade) @name = name @grade = grade end
Now say you create a new object (i.e., a real student). You "initialize" the object by passing in the arguments (i.e., name and grade):
student = Student.new ("John Smart", "First Grade")
Note that @name and @grade are instance variables, which are denoted by the @ sign. So, the Student class in my example presents an initialize method that takes a name and grade argument, and then "assigns" them to the two instance variables (ie. name and grade). The "instance variables" need to be "initialized" by passing in the two arguments to Student.new.
I hope this clarifies things for you.
Best of luck,