Попытка понять использование сам method_name по сравнению с Именем класса method_name в Ruby

Поскольку вы извлекаете данные и обновляете хранилище в методе componentDidMount, объект контактов может быть недоступен при первом рендеринге, и, следовательно, вы получаете ошибку. Обеспечьте проверку существования перед использованием

<div className="col-6">{patient.contact && patient.contact.address}</div>
14
задан pez_dispenser 14 May 2009 в 14:52
поделиться

3 ответа

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 относится к экземпляру .

13
ответ дан 1 December 2019 в 10:19
поделиться

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
12
ответ дан 1 December 2019 в 10:19
поделиться

Мне еще предстоит вникать в Ruby, но из вашего описания я бы сказал, что hash_password - это статический метод или его можно использовать статическим образом.

1
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: