'respond_to'와 'respond_to'에 대해 혼동이 있습니까?


79

railstutorial.org에서 Rails를 배우고 있는데 뭔가 혼란 스럽습니다. 이 장 에서 저자는 respond_to?User 객체에 대한 메소드를 사용 하여 콘솔에서 테스트를 수행하라고 말했고 정상적으로 작동합니다. 그러나 나중에 :encrypted_password속성에 대한 테스트를 작성할 때 그는 respond_to.

호기심으로 respond_to콘솔에서 User 개체를 시도했는데 메서드가 존재하지 않는다는 오류가 발생합니다. 아아, respond_to?대신을 사용하여 테스트를 작성하려고 respond_to하면 테스트가 실행되지 않습니다.

누군가 나에게 차이점을 설명해 주시고 테스트가 왜 실행 respond_to됩니까?

답변:


171

Ruby는 메소드 이름에서 ?!실제 문자로 취급합니다 . respond_to그리고 respond_to?다릅니다. ?이것이 참 또는 거짓으로 응답 해야 함을 나타냅니다 (관습 상 필수 사항이 아님). 구체적으로 특별히:

respond_to?클래스에 특정 메소드가 있는지 감지 하는 Ruby 메소드 입니다. 예를 들면

@user.respond_to?('eat_food')

User클래스에 eat_food메서드 가 있으면 true를 반환합니다 .

respond_toA는 레일 에있어서 특정 유형의 요청에 응답. 예를 들면 :

def index
  @people = Person.find(:all)

  respond_to do |format|
    format.html
    format.xml { render :xml => @people.to_xml }
  end
end

그러나 제공 한 RailsTutorial 링크 에서 RSpec의 메서드 와 상호 작용 하는 RSpec 메서드를 볼 수 있습니다 . 을 실행하지 않으면 콘솔에서 사용할 수 없습니다 .shouldrespond_torails console test


그러나 책의 예제를 읽으면 respond_to가 요청 유형이 아니라 속성과 함께 사용됩니다. Rails가 Ruby 메서드를 재정 의하여 속성도 허용할까요?
agente_secreto

1
그것은 테스트를위한 RSpec 방법입니다 : rspec.info/documentation ... ENV를 테스트로 설정하지 않으면 콘솔에서 사용할 수 없습니다.
Tim Sullivan

3
Ruby 작성자가 두 가지 다른 일에 대해 동일한 명령문 이름 "respond_to"를 사용하기로 결정한 것이 정말 이상합니다. 객체에 메서드가 있는지 또는 요청 유형에 응답하는지 검색합니다. 오, 그래요? 그것은 그들을 다르게 만듭니다. 와. \ o /
Junior Mayhé 2014 년

4
이것은 루비 제작자가 아닙니다. 첫 번째는 Ruby 메서드입니다. 두 번째는 ActionController의 Rails 메소드입니다. 세 번째는 RSpec 라이브러리 메서드입니다. ? 그리고! Ruby에서는 의미가 있으므로 respond_to와 respond_to의 차이점은 무엇입니까? 트림과 트리머의 차이와 같습니다.
Tim Sullivan

2
미래의 사용자가 혼동 ?하지 않도록 , 루비의 메소드 이름 끝에 있는 메소드가 부울을 반환 할 것이라는 보장 은 없습니다 . 은 ?다른 문자와 같은 메소드 이름의 한 부분이다. 물음표 메서드가 부울을 반환해야한다는 것은 잘 정립 된 규칙이지만 보편적으로 따르지는 않습니다. (예를 들어 github.com/rails/rails/pull/5329 및 물음표 메서드가 bool을 반환하지 않았을 때 발생하는 소동 참조 )
Andrew

4

respond_to?부울 평가입니다. 는 respond_to표시 정보를 결정하는 (일반적으로)를 사용한다. 여기에 더 많은 정보가 있습니다 . respond_to?그렇지 않은 경우가하는 거짓 경우 메소드가 true 존재 반환하는 경우 확인합니다.


3

이 테스트는 편리한 도우미를 사용하여 사용자에게 더 친숙합니다.

Ruby는 Ruby이므로 respond_to?다음과 같이 호출하면 좋은 오래된 것을 사용할 수 있습니다.

 @user.respond_to?(:encrypted_password).should be_true

respond_to컨트롤러에서 사용되는 다른 것이 있지만 이미 만난 것과는 관련이 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.