Возвращаемые значения Ruby и Rails совпадают… Неожиданно?

StackOverflow https://stackoverflow.com//questions/21033855

Вопрос

Во введении в классы Ruby и наследование в Ruby on Rails Rails Tutorial Майкл Хартл спрашивает, почему при запуске static_pages_controller.rb в консоли рельсов возвращается действие nil когда он вызывается для объекта StaticPagesController:

class StaticPagesController < ApplicationController
  def home
  end
  ...
end

В консоли рельсов:

>> controller = StaticPagesController.new
=> #<StaticPagesController:0x22855d0> (*)
>> controller.home
=> nil

(*)(мой рельс c возвращает атрибуты, связанные с объектом, но они не отображаются во 2-й редакции, но я использую Rails 4.0.2, а он, я полагаю, на Rails 3, что может быть ответом на мой вопрос, но посмотрим)

В частности, он спрашивает следующее:

Но подождите — действия не возвращают значений, по крайней мере, тех, которые имеют значение.Суть home действие ...заключается в отображении веб-страницы, а не в возврате значения....Что происходит?

Его ответ заключается в том, что Rails — это не Ruby:

Рельсы это написано в Ruby, но Rails — это не Ruby.Некоторые классы Rails используются как обычные объекты Ruby, а некоторые просто зерно для волшебной мельницы Rails.[курсив добавлен]

Мой Вопрос в том, почему это считается ответом?Когда я запускаю те же команды в IRB (после создания собственного класса StaticPagesController, хотя он и не наследуется от ActionController Rails), я также получаю nil возвращаемое значение:

My-Computer:app_root_directory David$ rails c
2.0.0p353 :001 > controller = StaticPagesController.new
2.0.0p353 :009 > controller.home
 => nil 
2.0.0p353 :010 > exit
My-Computer:app_root_directory David$ irb
cannot load such file -- hirb
>> class Controller
>> def home
>> end
>> end
=> nil
>> controller = Controller.new
=> #<Controller:0x007ff365299c70>
>> controller.home
=> nil

По сути, делаю ли я из мухи слона, задавая этот вопрос?Можно ли не понимать, почему он подчеркивает, почему действие (которое на самом деле является просто методом класса контроллера) возвращает результат? nil при вызове в консоли Rails?

Это было полезно?

Решение

Я думаю, вы неправильно поняли вопрос.Если вы посмотрите на контроллер так же, как на обычный класс Ruby, то домашний метод...без разницы.Это не делает ничего интересного (возвращать ноль довольно скучно).Как программист Ruby, вы бы не поместили это сюда, потому что программист Ruby объявляет методы для их использования (поэтому они должны возвращать значение или просто делать что-то наблюдаемое).

С другой стороны, в Rails действия (даже пустые) являются важной частью шаблона MVC.Вы объявляете эти методы и никогда не вызываете их (по крайней мере, явно), потому что в Rails это не просто метод, это способ сообщить Rails, что делать.

Вот почему он подчеркивает, что Rails — это не Ruby, особенно когда вы используете его с такими драгоценными камнями, как Capybara и Cocumber.Это предметно-ориентированные языки (DSL).Да они использовать Руби, но они не Руби.

Другие советы

В рубине все возвращает объект.Таким образом, утверждение «действия не возвращают значения» технически неверно.Без контекста остального, что было сказано, я предполагаю, что он имеет в виду вызов действия в жизненном цикле запроса Rails не возвращает значение, которое вас волнует.Где-то в стеке Rails вызов действия возвращает объект, но это не имеет отношения к вашей разработке.

Что касается вывода на консоль, вы получаете только nil потому что ваше действие пусто.Если вы изменили определение действия на:

def home
  1
end

Тогда бы вы получили 1 в качестве возвращаемого объекта как в контексте Rails, так и вне его.Я думаю, что еще одним ключевым моментом является рассмотрение nil значение, просто такое, которое представляет отсутствие значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top