2013-09-05 5 views
2

Я смотрю курс курса Code School Rails. Существует экземпляр класса zombie. zombie модель имеет метод:Rails Контроллер/Методы модели

def avatar_url 
    ... 
end 

В тесте .rb файл имеет следующее:

z.avatar_url 
  1. Когда я вызываю метод, как это, как делает Rails различать, если я звоню контроллер или модельный метод? Я не думал о том, чтобы называть модельный метод от другого, кроме контроллера, и только как Model.method, а не object.method.
  2. Если у моего контроллера и моей модели есть метод с тем же именем, как Rails знает, какой из них назвать?

Update:

Давайте класса String, как, например, это не модель, не так ли?

Так что я мог бы сказать:

s = String.new 
s.capitalize 

Если этот вызов не идет к модели, а не к контроллеру, где оно девается потом? Где бы определить класс, как String, в каталоге Rails?

+0

Помните, что вы можете позвонить obj.class, например. 'String.class', чтобы узнать, от чего он наследуется. Вы можете продолжить добавление '.class', чтобы вернуться к базовому классу Class Class –

+0

Хорошо, спасибо за подсказку. Где в папке rails я бы определил пользовательский класс? – Linus

+1

Пользовательские классы входят в '/ lib', если они не зависят от моделей или других вещей в'/app' –

ответ

8

Метод внутри контроллера можно вызывать только через URL.
Пример:

/things/super_action 

должен вызвать def super_action внутри ThingsController.

Что касается методов модели, к ним можно получить доступ в любом месте. Просто обратите внимание, если они экземпляр или класс методы:

Model.ultra_method 

Это метод класса вызов, это, вероятно, определяется как def self.ultra_method.

m = Model.new 
m.instance_method 

Это вызов метода экземпляра, и это, вероятно, определяется как def ultra_method.

UPDATE

String является core класс ruby языка. Как есть Array, Number и т. Д. В вашем примере вы создаете instance из String и звоните instance method класса String.

+0

Спасибо за ваш ответ, пожалуйста, ознакомьтесь с моим обновленным вопросом. – Linus

+0

Обновлен ответ. Я рекомендую вам прочитать о типах метода в рубине. =] – MurifoX

2

Вы можете вызвать методы класса/экземпляра класса из любого места в Rails. Модель - это просто сопоставление с вашей базой данных и выступает в качестве прокси для вашей базы данных. Когда вы звоните

z.avatar_url 

Вы вызываете метод на экземпляр модели «z». Поэтому неважно, откуда вы его называете, всегда будет вызывать метод модели.

Если вы определяете метод с тем же именем как в контроллере, так и в модели, вы всегда вызываете метод модели с экземпляром модели или классом модели. Методы контроллера - это просто действие в Rails, которое они никогда не ссылаются нигде. Они используются для маршрутизации Rails.

Надеюсь, что я поняла.

4

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

Методы класса - это методы, которые работают над самим классом. Вы можете сказать, когда метод является методом класса, потому что он будет привязан к заглавному имени класса (точно так же, как String.new). С другой стороны, методы экземпляра работают только на экземпляре класса, а не на самом классе (например, str = String.new; str.capitalize!). Обычно существует больше методов экземпляров, чем методы класса, поскольку экземпляры - это то, над чем вы работаете (new - наиболее распространенный метод класса, который вы увидите).

Как уже упоминалось, String не является моделью Rails; это базовый класс Ruby. Когда вы работаете в Rails, у вас есть доступ ко всем обычным классам Ruby, а также к другим классам и методам, которые определены в исходном коде Rails. Поэтому String не определен в Rails, но Rails предоставляет некоторые полезные методы экземпляров для строк (например, str.to_date).

Модель в Rails - это действительно класс Ruby. Чтобы понять работу модели, вы должны убедиться, что вы понимаете, как работают классы Ruby. То, что делает модели Rails особенными, заключается в том, что они наследуются от класса, определенного в исходном коде Rails, известном как ActiveRecord (любой класс в Ruby может наследовать от другого класса, это только один пример этого). ActiveRecord имеет ряд методов класса и экземпляра, которые также доступны для ваших моделей, поскольку они наследуют от ActiveRecord. Например, если у вас есть класс (модель), называемый Person, вы можете автоматически использовать метод класса Person.find(id) для поиска определенного экземпляра класса Person в базе данных. У вас также есть метод экземпляра person.save, чтобы сохранить экземпляр в базу данных.

Все это меня сбивало с толку, когда я только начинал, поэтому мой лучший совет - познакомиться с Руби, когда вы изучаете Rails.

+1

Большое спасибо за ваше объяснение, кажется, теперь яснее. Вы правы, я тоже новичок в Ruby, поэтому есть некоторые запутанные части. – Linus

+1

Поощряйте вас не писать «стены текста». Пункты друг друга –

+0

Извините, набрав на своем телефоне. Это немного тесно. Должно быть лучше сейчас :) – grandinero

Смежные вопросы