NoMethodError в контроллере с определенными методами - PullRequest
0 голосов
/ 19 апреля 2019

Я закончил реализацию и тестирование контроллера, затем переключался между ветвями Git и делал некоторые слияния здесь и там, и т. Д. Теперь я не могу использовать методы, которые я определил для контроллера, и также очень запутан, поскольку я получаю NoMethodError при попытке вызвать их.

Добавлены правка и решение в конце поста.


Использование Rails версии 5.2.3 - здесьЯ определил свой контроллер: app/controllers/paypal_access_token_controller.rb:

class PaypalAccessTokenController < ApplicationController
  before_action :authenticate_admin!, only: [:show]

  def njurf
    puts "#######################"
    puts "why can't i call these methods dangit"
    puts "#######################"
  end

  def show
    # doesn't really matter
  end

  def update
    # doesn't really matter either
    # no syntax errors, I promise
  end
end

Я бы хотел, чтобы метод update вызывался при запуске приложения Rails.Я добавил PaypalAccessToken.update() в файл config/environments/development.rb - это сработало.Теперь, когда я реализовал вещи в других, казалось бы, не связанных частях приложения, я больше не могу вызывать методы из этого контроллера.

Я удалил строку из config/environments/development.rb, чтобы я мог запустить консоль Railsи добавил метод njurf к контроллеру.Из консоли я попытался позвонить PaypalAccessTokenController.njurf и PaypalAccessTokenController.update, но оба дали мне сделанный на заказ NoMethodError.

Вот некоторые доказательства концепции

Loading development environment (Rails 5.2.3)
irb(main):001:0> PaypalAccessTokenController.update
Traceback (most recent call last):
        1: from (irb):1
NoMethodError (undefined method `update' for PaypalAccessTokenController:Class)
irb(main):002:0> PaypalAccessTokenController.update()
Traceback (most recent call last):
        1: from (irb):2
NoMethodError (undefined method `update' for PaypalAccessTokenController:Class)
irb(main):003:0> PaypalAccessTokenController.njurf()
Traceback (most recent call last):
        1: from (irb):3
NoMethodError (undefined method `njurf' for PaypalAccessTokenController:Class)

Итак, класс контроллерасуществует, по крайней мере, но я не знаю, почему я получаю эту ошибку - и я не знаю, как ее исправить.

Любая помощь будет признательна.

edit: Этот контроллер имел маршруты только для метода show.Я удалил этот маршрут, когда внедрил и протестировал метод update, потому что я больше не нуждался / не хотел, чтобы эти методы были доступны через URL-адреса.Это то, что сделало методы недоступными из консоли.


решение: Либо я уезжаю по пути к одному из методов контроллера - или , как РикиИспанский и amit_saxena, указанные ниже, должным образом объявляют методы как методы класса.

Спасибо за ответы

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Вы можете вызвать его, когда определяете его с помощью self

def self.njurf
  puts "#######################"
  puts "why can't i call these methods dangit"
  puts "#######################"
end
PaypalAccessTokenController.njurf
#######################
why can't i call these methods dangit
#######################
=> nil
0 голосов
/ 19 апреля 2019

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

PaypalAccessTokenController.new.update

, но это не значит, что он будет работать (вероятно, ему нужно params, чтобы работать), но вы не получите NoMethodError.Скорее всего, вы что-то напутали в вашем файле маршрутов.Вы можете проверить маршруты, используя:

bundle exec rake routes

, который точно скажет вам, на какой маршрут указывает какой controller#action, и должен дать вам несколько советов о том, в чем проблема.Вставьте соответствующие маршруты здесь, вы не можете понять это.Также обратите внимание на метод HTTP (GET / POST / PATCH).Возможно, вы используете GET вместо PATCH и в результате получаете ошибку.

0 голосов
/ 19 апреля 2019

Это может выглядеть странно, но вы уверены, что определили правильные ресурсы на маршрутах?

...