Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does :this means in Ruby on Rails?

Tags:

symbols

ruby

I'm new to the Ruby and Ruby on Rails world. I've read some guides, but i've some trouble with the following syntax. I think that the usage of :condition syntax is used in Ruby to define a class attribute with some kind of accessor, like:

class Sample
  attr_accessor :condition
end

that implicitly declares the getter and setter for the "condition" property. While i was looking at some Rails sample code, i found the following examples that i don't fully understand.

For example:

@post = Post.find(params[:id])

Why it's accessing the id attribute with this syntax, instead of:

@post = Post.find(params[id])


Or, for example:

@posts = Post.find(:all) 

Is :all a constant here? If not, what does this code really means? If yes, why the following is not used:

@posts = Post.find(ALL)

Thanks

like image 403
Mark Avatar asked May 10 '10 17:05

Mark


People also ask

What is symbol in Ruby on Rails?

Ruby symbols are defined as “scalar value objects used as identifiers, mapping immutable strings to fixed internal values.” Essentially what this means is that symbols are immutable strings. In programming, an immutable object is something that cannot be changed.

What does %I mean in Ruby?

The usage of "%I" is just to create hash keys from an array of strings, separated by whitespaces.

What does :: mean in Ruby?

The :: is a unary operator that allows: constants, instance methods and class methods defined within a class or module, to be accessed from anywhere outside the class or module. Remember in Ruby, classes and methods may be considered constants too.

What are symbols used for in Ruby?

What's a Symbol in Ruby? A symbol is a unique instance of the Symbol class which is generally used for identifying a specific resource. A resource can be: a method.


2 Answers

A colon before text indicates a symbol in Ruby. A symbol is kind of like a constant, but it's almost as though a symbol receives a unique value (that you don't care about) as its constant value.

When used as a hash index, symbols are almost (but not exactly) the same as using strings.

Also, you can read "all" from :all by calling to_s on the symbol. If you had a constant variable ALL, there would be no way to determine that it meant "all" other than looking up its value. This is also why you can use symbols as arguments to meta-methods like attr_accessor, attr_reader, and the like.

You might want to read up on Ruby symbols.

like image 105
Mark Rushakoff Avatar answered Oct 18 '22 23:10

Mark Rushakoff


:all is a symbol. Symbols are Ruby's version of interned strings. You can think of it like this: There is an invisible global table called symbols which has String keys and Fixnum values. Any string can be converted into a symbol by calling .to_sym, which looks for the string in the table. If the string is already in the table, it returns the the Fixnum, otherwise, it enters it into the table and returns the next Fixnum. Because of this, symbols are treated at run-time like Fixnums: comparison time is constant (in C parlance, comparisons of symbols can be done with == instead of strcmp)

You can verify this by looking at the object_id of objects; when two thing's object_ids are the same, they're both pointing at the same object.

You can see that you can convert two strings to symbols, and they'll both have the same object id:

"all".to_sym.object_id == "all".to_sym.object_id #=> true

"all".to_sym.object_id == :all.object_id #=> true

But the converse is not true: (each call to Symbol#to_s will produce a brand new string)

:all.to_s.object_id == :all.to_s.object_id #=> false

like image 35
John Douthat Avatar answered Oct 19 '22 01:10

John Douthat