Rails не распознает метод модели - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть метод в моей модели, и он фактически был создан в соответствии с рекомендациями (с self.method_name). Однако, когда я go на своей консоли и пытаюсь проверить метод, я получаю ошибку undefined method. Кто-нибудь знает почему?

моя модель

  class Country < ApplicationRecord
    has_many :facts
    has_many :dishes
    has_many :touristic_places
    include HTTParty
    base_uri 'restcountries.eu/rest/v2/region/africa'

    def self.save_data_from_api
        response = HTTParty.get(base_uri)
        country_data = JSON.parse(response)
        countries = country_data.map do |line|
            c = Country.new
            c.name = line.name
            c.save
            c
        end
        countries.select(&:persisted?)
    end

На моем контроллере

  def save_data_from_api
    countrie = Country.save_data_from_api
  end

Тест на консоли Rails ошибка:

> Country.save_data_from_api
    Traceback (most recent call last):
        2: from (irb):5
        1: from (irb):5:in `rescue in irb_binding'
NoMethodError (undefined method `save_data_from_api' for #<Class:0x00007fc9ec71edd8>)

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Выйдите из консоли и запустите ее снова. Автоматическая перезагрузка работает только на сервере, а не на консоли.

0 голосов
/ 22 апреля 2020

Не делайте HTTP-звонки в вашей модели. Даже без какого-либо кода ваша модель уже имеет массу обязанностей, которые она получает от ActiveRecord::Base:

  • проверок
  • ассоциаций
  • постоянство
  • обратные вызовы
  • naming
  • i18n

Вместо этого создайте отдельный клиентский объект, который извлекает данные из API. Это дает вам объект, который выполняет только одну работу, которую легко протестировать и заглушить:

# app/clients/rest_countries_client.rb
# HTTP client for the restcountries.eu API
class RestCountriesClient 
  include HTTParty

  base_uri 'restcountries.eu/rest/v2'
  format :json # this will automatically parse the response

  def self.region(region)
     get("/region/#{region}")
  end
end

Это позволяет просто протестировать вызов API из консоли, вызвав RestCountriesClient.region('africa'), и вы можете увидеть возвращено га sh без каких-либо побочных эффектов.

Для фактического выполнения вызова и сохранения объектов, которые вы хотите использовать в качестве служебного объекта или ActiveJob :

# app/jobs/country_importer_job.rb
# Persists countries from the restcountries.eu API
class CountryImporterJob < ApplicationJob
  def perform(region = 'africa')
    response = RestCountriesClient.region(region)
    return unless response.success?
    response.map do |line|
      Country.create(name: line["name"])
    end.select(&:persisted?)
  end
end

Затем вы вызываете эту работу из контроллера:

CountryImporterJob.perform_now('africa')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...