Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
if session[:login]
10/0
else
11/0
end if
doesn’t inform me about division by zero. Actually it seems that none of
paths is evaluated. I don’t get it. I’ve checked few tutorials, none of
the said anything about possibility of such behavior.
[/code]
doesn’t inform me about division by zero. Actually it seems that none of
paths is evaluated. I don’t get it. I’ve checked few tutorials, none of
the said anything about possibility of such behavior.
I think the problem is the if at the end of the last line. In ruby, the
if-
then-else statement is closed by end, not end if. So, ruby thinks that
the if
after the end is the beginning of a if modifier statement, that is, of
something like
puts “greater” if x > 5
Since the if modifier requires some condition after the if keyword, ruby
will
look for it in the next line and interpret what you wrote like this:
(
if session[:login]
10 / 0
else
11 / 0
end
) if … #whatever is in next line
This means that if the expression which gets interpreted as the
condition for
the if modifier (that is, the second if) is false or nil, all the first
if
statement won’t be executed.
[/code]
doesn’t inform me about division by zero. Actually it seems that
none of
paths is evaluated. I don’t get it. I’ve checked few tutorials, none
of
the said anything about possibility of such behavior.
Yes, because the code never gets evaluated. if-blocks are ended by
“end” and not “end if”. What you wrote can be interpreted as:
====
(if session[:login]
10/0
else
11/0
end) if
So: execute the if statement, if… As there is no second condition
on the second if, it is always false. So the code inside the
paranthesis will never get executed.
This is happening because ruby allows you to write a condition after a
statement, e.g.:
====
do_weird_things if (true == ruby.is_driving_crazy?(you))
Regards,
Florian G.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
1
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end
works, but commenting out 1
if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end
if true then @users = User.find( :all )
else @users = User.find( :all )
end if
1
respond_to do |format|
format.html # index.html.erb
…
See Florian’s message.
Replace “end if” with “end” only – it’s modifying the entire previous
conditional to only happen if the bit that follows returns true (or a
truthy
value).
$ ruby -e ‘if true then p 1 else p 2 end if false’
$ ruby -e ‘if true then p 1 else p 2 end if true’
1
The “if false” and “if true” at the end govern the whole thing. In
your first example, you’re doing:
if true then @users = … else @users = … end if 1
Since 1 is true, it gets executed.
In your second example, you’re doing:
if true then @users = … else @users = … end if respond_to…
I imagine respond_to must return nil. Therefore, you’re telling the
first if statement not to execute.
This “if end if <other_condition>” idiom is extremely
unusual and almost certainly not what you intend to do. As others have
said, it looks like you just want an if block, which ends with end.