Поскольку вы извлекаете данные и обновляете хранилище в методе componentDidMount
, объект контактов может быть недоступен при первом рендеринге, и, следовательно, вы получаете ошибку. Обеспечьте проверку существования перед использованием
<div className="col-6">{patient.contact && patient.contact.address}</div>
def before_create
self.hashed_password = User.hash_password(self.password)
end
В этом примере User.hash_password
вызывает метод hash_password
в классе User
, тогда как self.hashed_password =
вызывает метод hashed_password =
для этого конкретного экземпляра пользователя
.
Если вы замените User.hash_password
с self.hash_password
, Ruby будет жаловаться на NoMethodError
, потому что в классе User нет метода экземпляра с именем
. Однако вы можете заменить его на hash_password
self.class.hash_password
.
Если вы замените self.hashed_password =
просто на hashed_password =
, Ruby создаст локальную переменную с именем hashed_password
, а не вызовет метод экземпляра hashed_password =
. Вам необходимо явно добавить self
, если вы хотите вызывать средства записи атрибутов.
self
в определении метода ( def self.hash_password
) делает hash_password
метод класса вместо метода экземпляра. В этом контексте self
относится к классу . В контексте метода экземпляра self
относится к экземпляру .
self
в определении метода ( def self.hash_password
) делает hash_password
методом класса вместо метода экземпляра. В этом контексте self
относится к классу . В контексте метода экземпляра self
относится к экземпляру .
self
в определении метода ( def self.hash_password
) делает hash_password
методом класса вместо метода экземпляра. В этом контексте self
относится к классу . В контексте метода экземпляра self
относится к экземпляру .
You are asking the difference between a class method and an instance method.
There are a few ways of defining a class method:
class Klass
def Klass.method_name
..
end
end
which is the same as doing:
class Klass
def self.method_name
..
end
end
or the preferred ruby idiom:
class Klass
class << self
def method_name
..
end
end
end
If Klass is already declared you can also do..
def Klass.method_name
..
end
or:
class << Klass
def method_name
..
end
end
or you could even use Module#extend:
Klass.extend(Module.new { def method_name; puts 'ducky'; end })
Much like you would add a singleton method to an object. In fact class methods are singleton methods which operate on the class level.
In rails ActiveRecord for example you have a class method 'find' which you can use on any Model:
Person.find(1)
and instance methods like 'save' which operates on the individual object
person = Person.find(1)
...
person.save
In the current project I am working on I have a model Feed which contains data feeds. Periodically I need to run a method which updates all the feeds so i have an fetch_all method which accomplishes this.
class Feed < ActiveRecord::Base
// class method Feed.fetch_all
def self.fetch_all
Feed.all.each do |feed|
feed.fetch_value
end
end
// instance method
def fetch_value
// grabs updated value and saves
end
end
Мне еще предстоит вникать в Ruby, но из вашего описания я бы сказал, что hash_password - это статический метод или его можно использовать статическим образом.