Там происходит несколько разных вещей:
if @controller.controller_name == "projects" || @controller.controller_name == "parts"
это дает то поведение, которое вы хотите, я предполагаю. Логика довольно проста: вернуть true, если имя контроллера - "projects" или "parts"
Другой способ сделать это:
if ["projects", "parts", "something else..."].include? @controller.controller_name
Это проверит, находится ли имя контроллера где-то в списке.
Теперь для других примеров:
if @controller.controller_name == ("projects" || "parts")
Это не будет делать то, что вы хотите. Сначала он оценит ("projects" || "parts")
(что приведет к "проектам"), а затем будет только проверять, совпадает ли имя контроллера с этим.
if @controller.controller_name == "projects" || "parts"
Этот становится еще более странным. Это всегда приведет к истине. Сначала он проверит, совпадает ли имя контроллера с «проектами». Если это так, утверждение оценивается как истинное. Если нет, то он оценивает «части» сам по себе: который также оценивается как «истина» в ruby (любой объект, отличный от нуля, считается «истинным» для целей булевой логики »)