Любой экземпляр класса будет иметь общедоступные методы экземпляра, доступные для вызова на объекте экземпляра. Распространено создание экземпляров класса модели в действии контроллера.
Вот пример, поясняющий предыдущий ответ и комментарии, как вы можете сделать это в Rails.
class Person < ActiveRecord::Base
def say_hello
language == 'DE' ? 'Guten Tag' : 'Hello'
end
end
class PersonsController < ApplicationController
def random_person
@random_person = Person.find(Person.pluck(:id).sample)
# you can now call @random_person.say_hello
end
def person_greetings
# this examples assumes we only have 2 languages, EN and DE
languages = Person.pluck(:language).uniq.sort
@greetings = languages.each_with_object({}) do |language, hash|
hash[language] = Person.new(language: language).say_hello
end
end
end
# @greetings should return the following hash
=> {
"DE" => "Guten Tag",
"EN" => "Hello"
}
Аналогично, методы класса также могут вызываться напрямую, когда это необходимо, внутри метода действия контроллера, например, в модели у вас может быть определен такой метод класса внутри модели Person.
def self.languages
pluck(:language).uniq.sort
end
Этот метод может быть вызван из любого контроллера или других классов, где это уместно, например:
def languages
@people_count = Person.count # active record method to get number of people in database
@languages = Person.languages
end
Где вы можете использовать это внутри вида действия контроллера
<div>
There are <%= @people_count %> total people in the system.
Of them, <%= @languages.count %> languages are spoken.
Those include the following:
<ol>
<% @languages.each do |language| %>
<li><%= language %></li>
</ol>
</div>