ruby on rails, colon at back or front of variables
Solution 1
What i have understand so far is that
:variable
in ruby, is to say that this variable will not be able to change, which is similar to constant in other language.
I'm not sure if I understand that statement. In Ruby, constants start with an uppercase letter:
Foo = 1
Reassignment generates a warning:
Foo = 1
Foo = 2 #=> warning: already initialized constant Foo
Variables start with a lowercase letter and reassignment doesn't cause a warning (they are supposed to change):
foo = 1
foo = 2 # no warning
Symbols start with a colon:
:a_symbol
:Uppercase_symbol
:"i'm a symbol, too"
They often represent static values, e.g. :get
and :post
. Symbols are memory efficient, because they are created only once - the same symbol literal always returns the same object. Checking if two symbols are equal is a cheap operation.
Both
key:
andmethod:
(...) What does that this represent?
This is an alternate syntax for hashes. You can type it in IRB to see the result:
{ foo: 1, bar: 2 }
#=> {:foo=>1, :bar=>2}
There are double colons inbetween variables? now I am guessing that
Blog:
is one variable, and:Application
is constant.
No, Blog
and Application
are both constants and ::
is the scope resolution operator. It can be used to access nested constants, e.g.:
module Foo
class Bar
BAZ = 123
end
end
Foo::Bar::BAZ #=> 123
Solution 2
Rails.application.config.session_store :cookie_store, key: '_blog_session'
session_store
is a method that takes two "Arguments":
(could also be session_store :cookie_store, { key: '_blog_session' }
)
Similarly for link_to "Delete", article, confirm: "Are you sure?", method: :delete
-
"Delete"
is a string -
article
a variable -
{ confirm: '...', method: :delete }
hash whereconfirm:
,method:
and:delete
are Symbols again.
While Blog::Application
:: is basically a namespace resolution operator. A way for you to address the Application class in the Blog
module.
Hope this helps. Have a look at the documentation I referenced, it is explained rather nicely.
Related videos on Youtube
Comments
-
vdj4y almost 2 years
I am new to ruby , and rails both. I think Rails is one of the best API, and ruby is quite unique, it seems that ruby can cleverly do "assumptions" to help developer. But I am not too sure to what extend.
my questions is about colon in variable.
What i have understand so far is that :variable in ruby, is to say that this variable will not be able to change, which is similar to constant in other language. Am I correct??Then my confusion is, sometimes i see the colon infront of variable, like this
Rails.application.config.session_store :cookie_store, key: '_blog_session' <%= link_to "Delete", article, confirm: "Are you sure?", method: :delete %>
Both key: and method: has colon in front.What does that this represent? and Furthermore
Blog::Application.routes.draw.do root :to => "articles#index" end
There are double colons inbetween variables? now I am guessing that Blog: is one variable, and :Application is constant. which i doubt it is, because it doesnt make sense. Please enlighten me?
thank you-
Marek Lipka about 9 yearsThis is neither a variable, nor a constant. It's literal syntax to Ruby Symbol.
Blog::Application
syntax isn't related to symbols, it's about resolving namespaces. -
vdj4y about 9 yearsJust to be clear, do you mean Blog is a namespace? or Application is a namespace? what about colon in front of, like method: or key:
-
Marek Lipka about 9 yearsBlog is namespace. Look at the link I provided. Syntax like
{method: 'delete'}
etc. is a hash syntax, equivalent to{:method => 'delete'}
. -
vdj4y about 9 yearsI see. I will check your link, thanks. I should give you the points then. :)
-
-
Stefan about 9 years
confirm: "Are you sure?", method: :delete
is one hash, not two -
Gupta about 9 years@Stefan one more confusion
params = { }
params[mehtods:] = :delete syntax error, unexpected '] ` but if params[:mehtods] = :delete now it is fine why ? -
Stefan about 9 years@VinayGupta the alternate syntax only works for key-value pairs, e.g.
{ method: :delete }
. Otherwise, the colon comes always first. -
wpp about 9 yearsVery concise. Like this answer