Self устанавливается для контроллера вместо экземпляра - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю простое приложение для сокращения URL. В модели у меня есть метод, который создает short_url для использования вместо исходного URL.

class ShortenersController < ApplicationController
    before_action :find_shortener, only: [:info, :show] 
    before_action :generate_unigue_shorty, only: [:create]
    def new
        @shortener = Shortener.new
    end

    def create
        @shortener = Shortener.new
        @shortener.main_url = params[:main_url]

        if @shortener.save
            redirect_to info_path(@shortener.short_url)
        else
            flash[:notice] = "Someting went wrong"
            render 'new'
        end
    end

    private
    def shortener_params
        params.require(:shortener).permit(:main_url, :short_url)
    end

    def find_shortener
        @shortener = Shortener.find_by_short_url(params[:short_url])
    end
end

Модель:

class Shortener < ApplicationRecord
  before_create :generate_unique_shorty
    def generate_unique_shorty
      shorty = SecureRandom.hex(4)
        if  Shortener.all.any? {|a| a.short_url == shorty}
            self.generate_unique_shorty
        else
            self.short_url = shorty
        end
    end
end

Ошибка, которую я получаю: undefined метод `generate_unigue_shorty 'для #ShortenersController: 0x00007fbfbc735db0 Похоже, что объект self в этом методе установлен как объект Controller, и это должен быть экземпляр класса Shortener (@shortener)

1 Ответ

0 голосов
/ 06 ноября 2018

Опечатка здесь: generate_unigue_shorty g => q

Также в вашем контроллере нет метода с именем generate_unique_shorty. before_action в контроллере ищет метод в контроллере , а не в модели.

При этом, поскольку у вас уже есть обратный вызов before_create в вашей модели, который генерирует уникальные шорты, нет необходимости дублировать это поведение в контроллере.

TL; DR: удалите before_action :generate_unigue_shorty, only: [:create] с вашего контроллера.

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

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