2013-09-05 2 views
2

코드 스쿨 레일 테스트 과정을보고 있습니다. 클래스 zombie의 인스턴스가 있습니다. zombie 모델은 방법이있다 : 내가 전화 한 경우레일 컨트롤러/모델 방법

z.avatar_url 
  1. 나는이 같은 메서드를 호출하는 방법 레일 구별 않습니다 테스트 내

    def avatar_url 
        ... 
    end 
    

    .rb 파일은 다음있다 컨트롤러 또는 모델 방법? 나는 컨트롤러가 아닌 다른 모델의 메소드를 호출하는 것을 생각하지 않았으며 Model.method과 같고 object.method이 아닙니다.

  2. 내 컨트롤러와 모델에 같은 이름의 메소드가있는 경우 Rails에서 호출 할 수있는 방법을 어떻게 알 수 있습니까?

업데이트 :

바로,이 모델이 아닌 예를 들어 String 클래스를 취할 수 있습니다?

그래서 내가 말할 수 :

s = String.new 
s.capitalize 

을이 호출이 모델로 이동하지 않고 컨트롤러에, 어디 그 다음 가지 않는하지 않으면? String과 같은 클래스는 Rails 디렉토리에 어디에 정의되어 있습니까?

+0

obj.class를 호출 할 수 있습니다. 'String.class'을 사용하여 상속받은 것을 확인하십시오. '.class'를 계속 추가하여 기본 'Class' 클래스로 돌아갈 수 있습니다. –

+0

팁 주셔서 감사합니다. 레일 폴더에서 사용자 정의 클래스를 정의하는 위치는 어디입니까? – Linus

+1

커스텀 클래스는'/ app'에있는 모델이나 다른 것들에 의존하지 않는 한'/ lib'에 있습니다. –

답변

8

컨트롤러 내부의 메소드는 URL을 통해서만 호출 할 수 있습니다.
예 :

/things/super_action 

def super_actionThingsController 내부를 호출해야합니다.

모델 방법은 어디서나 액세스 할 수 있습니다.

Model.ultra_method 

이 클래스 메서드 호출, 그것은 아마 def self.ultra_method 다음과 같이 정의된다 그들이 인스턴스 또는 클래스 방법이 있다면 그냥주의.

m = Model.new 
m.instance_method 

이것은 인스턴스 메서드 호출이며 아마도 def ultra_method으로 정의됩니다.

UPDATE는

Stringruby 언어의 core 클래스입니다. 마찬가지로 Array, Number, 등등입니다. instanceString을 만들고 String 클래스의 instance method을 호출합니다.

+0

답변 해 주셔서 감사합니다. 업데이트 된 질문을 참조하십시오. – Linus

+0

답변이 업데이트되었습니다. 루비에서 메소드의 타입을 읽는 것을 추천한다. =] – MurifoX

2

레일스의 어느 곳에서나 모델 클래스/인스턴스 메소드를 호출 할 수 있습니다. 모델은 데이터베이스에 대한 매핑이며 데이터베이스의 프록시 역할을합니다. 호출 할 때

z.avatar_url 

"z"모델 인스턴스의 메소드를 호출하고 있습니다. 따라서 어디에서 호출하든 항상 모델의 메서드를 호출합니다.

컨트롤러와 모델 모두에서 동일한 이름으로 메소드를 정의하면 모델 인스턴스 또는 모델 클래스를 사용하여 항상 모델의 메소드를 호출하게됩니다. 컨트롤러 메소드는 단순히 어디서나 참조 된 적이없는 Rails의 액션입니다. 그것들은 Rails 라우팅에 사용됩니다.

희망 나는 분명하다.

4

레일스뿐만 아니라 루비도 처음 사용하신 것 같습니다. Ruby에서 클래스는 객체의 유형에 대한 설명과 비슷합니다 (클래스 자체도 객체 임에도 불구하고). 정의 된 클래스가있을 때마다 String.new과 같이 클래스를 새로 만들 수 있습니다. 클래스에는 항상 대문자가 사용됩니다.

클래스 메서드는 클래스 자체에서 작동하는 메서드입니다. 메서드가 클래스의 대문자로 된 이름 (예 : String.new)에 연결되므로 메서드가 클래스 메서드 인 경우이를 알 수 있습니다. 반면 인스턴스 메서드는 클래스 자체가 아닌 클래스의 인스턴스에서만 작동합니다 (예 : str = String.new; str.capitalize!). 일반적으로 클래스 메소드보다 인스턴스 메소드가 더 많습니다. 인스턴스는 실제로 작업하고있는 것이므로 (new이 가장 일반적인 클래스 메소드입니다).

다른 언급이 있기 때문에 String은 Rails 모델이 아닙니다. 그것은 기본적인 Ruby 클래스입니다. Rails에서 작업 할 때, 모든 정규 Ruby 클래스뿐만 아니라 Rails의 소스 코드 내에 정의 된 다른 클래스 및 메소드에 액세스 할 수 있습니다. String은 Rails 자체에 정의되어 있지 않지만 Rails는 문자열에 유용한 인스턴스 메소드 (예 : str.to_date)를 제공합니다.

레일스의 모델은 실제로 루비 클래스입니다. 모델의 동작을 이해하려면 Ruby 클래스의 작동 방식을 이해해야합니다. Rails 모델을 특별하게 만드는 이유는 Rails의 소스 코드 인 ActiveRecord에 정의 된 클래스를 상속한다는 것입니다 (Ruby의 모든 클래스는 다른 클래스에서 상속받을 수 있습니다. ActiveRecord에는 ActiveRecord에서 상속되기 때문에 모델에서 사용할 수있는 많은 클래스 및 인스턴스 메서드가 있습니다. 예를 들어 Person이라는 클래스 (모델)가있는 경우 Person.find(id) 클래스 메서드를 자동으로 사용하여 데이터베이스에서 Person 클래스의 특정 인스턴스를 조회 할 수 있습니다. 인스턴스를 데이터베이스에 저장하는 person.save 인스턴스 메소드도 있습니다.

처음 시작했을 때이 모든 것이 나에게 혼란 스러웠습니다. 따라서 레일스를 배울 때 Ruby에 익숙해지는 것이 가장 좋습니다.

+1

설명 해 주셔서 대단히 감사합니다. 지금은 분명해 보입니다. 당신 말이 맞아요. 루비도 처음이에요. 그래서 혼란스러운 부분이 있습니다. – Linus

+1

"텍스트의 벽"을 작성하지 않도록하십시오. 단락은 모든 사람의 친구입니다 –

+0

죄송합니다, 내 전화에 입력. 그것은 다소 갑갑합니다. 지금은 더 좋을거야 :) – grandinero