문제

Ruby on Rails Rails Tutorial의 Ruby 클래스 및 상속에 대한 소개에서 Michael Hartl은 다음을 실행할 때 이유를 묻습니다. static_pages_controller.rb Rails 콘솔에서 작업이 반환됩니다. nil StaticPagesController 객체에서 호출될 때:

class StaticPagesController < ApplicationController
  def home
  end
  ...
end

레일 콘솔에서:

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

(*)(내 Rails c는 객체와 관련된 속성을 반환하지만 2판에는 표시되지 않습니다. 하지만 저는 Rails 4.0.2를 사용하고 있고 그는 Rails 3을 사용하고 있다고 생각합니다. 내 질문이지만 나중에 살펴 보겠습니다)

구체적으로 그는 다음과 같이 묻는다.

하지만 잠깐만요. 작업은 적어도 중요한 값은 반환하지 않습니다.요점은 home 행동 ...값을 반환하는 것이 아니라 웹페이지를 렌더링하는 것입니다....무슨 일이야?

그의 대답은 Rails가 Ruby가 아니라는 것입니다.

레일스는 쓰여진 Ruby이지만 Rails는 Ruby가 아닙니다.일부 Rails 클래스는 일반 Ruby 객체처럼 사용되지만 일부는 단지 Rails의 마법 공장을 위한 제분소.[강조 추가]

나의 질문은 왜 그것이 대답으로 간주됩니까?IRB에서 동일한 명령을 실행하면(비록 Rails의 ActionController에서 상속되지는 않지만 자체 StaticPagesController 클래스를 만든 후) 다음과 같은 결과도 얻습니다. 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 클래스를 보는 방식으로 컨트롤러를 본다면 홈 메소드는...말이 안 돼요.흥미롭지 않습니다 (nil을 반환하는 것은 다소 지루합니다).Ruby 프로그래머로서 당신은 거기에 넣지 않을 것입니다. 왜냐하면 Ruby 프로그래머는 메소드를 사용하기 위해 메소드를 선언하기 때문입니다(따라서 메소드는 값을 반환하거나 관찰 가능한 작업을 수행해야 합니다).

반면에 Rails에서는 작업(비어 있는 경우라도)이 MVC 패턴의 필수 부분입니다.이러한 메소드를 선언하고 결코 호출하지 않습니다(적어도 명시적으로는 아님). 왜냐하면 Rails에서는 이는 단순한 메소드가 아니라 Rails에게 무엇을 해야 하는지 알려주는 방법이기 때문입니다.

이것이 그가 Rails가 Ruby가 아니라고 강조하는 이유입니다. 특히 Capybara 및 Cocumber와 같은 gem과 함께 사용할 때 더욱 그렇습니다.이는 DSL(도메인 특정 언어)입니다.응, 그들은 루비를 사용하세요, 하지만 그 사람들은 루비가 아니야.

다른 팁

루비에서 모든 것 객체를 반환합니다.따라서 "작업은 값을 반환하지 않습니다"라는 진술은 기술적으로 사실이 아닙니다.나머지 내용의 맥락을 고려하지 않고 그가 말한 내용은 다음과 같습니다. Rails 요청 수명 주기에서 작업을 호출해도 관심 있는 값이 반환되지 않습니다..Rails 스택 어딘가에서 작업 호출이 객체를 반환하지만 이는 개발과 관련이 없습니다.

콘솔 출력의 경우 nil 당신의 행동이 공허하기 때문입니다.작업 정의를 다음과 같이 변경한 경우:

def home
  1
end

그러면 당신은 받게 될 것입니다 1 Rails 컨텍스트와 외부 모두에서 반환 객체로 사용됩니다.또 다른 핵심 포인트는 다음과 같습니다. nil 값, 즉 값이 없음을 나타내는 값입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top