if выполняет  ветку then если условие truthy (сводится к true), в противном случае выполняет ветку else.
a = 1
if a > 0
  a = 10
end
a #=> 10
b = 1
if b > 2
  b = 10
else
  b = 20
end
b #=> 20
Чтобы написать цепочку условий, используйте elsif:
if some_condition
  do_something
elsif some_other_condition
  do_something_else
else
  do_that
end
После выполнения if тип переменной будет зависеть от типа выражений в каждой из ветвей.
a = 1
if some_condition
  a = "hello"
else
  a = true
end
# a : String | Bool
b = 1
if some_condition
  b = "hello"
end
# b : Int32 | String
if some_condition
  c = 1
else
  c = "hello"
end
# c : Int32 | String
if some_condition
  d = 1
end
# d : Int32 | Nil
Обратите внимание, что если в одной из ветвей не будет указан тип переменной, после выполнения if он будет содержать тип Nil.
В теле оператора if переменная будет того типа, который назначается в данной ветке. Если тип не был переназначен, он останется прежним:
a = 1
if some_condition
  a = "hello"
  # a : String
  a.size
end
# a : String | Int32
Иначе говоря, тип переменной будет определяться последним выражением, назначившим его.
Если одна из ветвей не достигает конца оператора if, например, в случае использования return, next, break или raise, определяемый ей тип не будет назначен переменной после выхода из тела if:
if some_condition
  e = 1
else
  e = "hello"
  # e : String
  return
end
# e : Int32