If behavior

Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
[code]
if session[:login]
   10/0
else
   11/0
end if
[/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.

···

--
Posted via http://www.ruby-forum.com/.

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.

I hope this helps

Stefano

···

On Saturday 19 April 2008, Qwe Qwe wrote:

Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
[code]
if session[:login]
   10/0
else
   11/0
end if
[/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:

···

On Apr 19, 2008, at 1:57 PM, Qwe Qwe wrote:

Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
[code]
if session[:login]
  10/0
else
  11/0
end if
[/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.
--
Posted via http://www.ruby-forum.com/\.

====
(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 Gilcher

ehm great

    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

makes the if not evaluated.

why?

···

--
Posted via http://www.ruby-forum.com/.

Hi,

···

On Sat, Apr 19, 2008 at 10:14 PM, Qwe Qwe <frea@email.com> wrote:

   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).

HTH,
Arlen

I don't think so. Without a condition after the if, you'll get a SyntaxError.
At least, that's what my tests show. Try running this:

ruby -e ' if true; puts "TRUE"; end if'

As I explained in my other post, since ruby doesn't find a condition on the
same line of the if, it'll go on looking for it in the following line.

Stefano

···

On Saturday 19 April 2008, Florian Gilcher wrote:

As there is no second condition
on the second if, it is always false.

Hi --

ehm great

   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

makes the if not evaluated.

why?

$ 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 <condition> 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.

David

···

On Sat, 19 Apr 2008, Qwe Qwe wrote:

--
Rails training from David A. Black and Ruby Power and Light:
   INTRO TO RAILS June 9-12 Berlin
   ADVANCING WITH RAILS June 16-19 Berlin
   INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!

see "If and unless modifiers", on this page:
http://www.rubycentral.com/pickaxe/tut_expressions.html

···

On Sat, Apr 19, 2008 at 5:14 AM, Qwe Qwe <frea@email.com> wrote:

ehm great

    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

makes the if not evaluated.

why?