@modernstyle
Code GOD

Как перенести create в фоновую задачу?

Пытаюсь перенести create action в фон с помощью delayed job но не могу понять как нужно действовать со strong params. Сначала я попробовал все делать в контроллере:

def create
    MyController.delay.create_and_email(current_app_user)

    respond_to do |format|
      format.js {}
    end
  end

  def create_and_email(user)
    @user = AppUser.find_by(id: user.id)
    @link_share = @user.link_shares.build(link_share_params)
    @link_share.save
  end


Задача фэйлится потому что не понимает, что есть link_share_params

Тогда попробовал подключить модель:

Контроллер:
def create
    @user = current_app_user
    @user.delay.create_and_email(link_share_params)

    respond_to do |format|
      format.js {}
    end
  end


Model:

def create_and_email(params)
    link_share = self.link_shares.build(params)
    link_share.save
  end


Тоже провал: Job AppUser#create_and_email (id=15) FAILED (0 prior attempts) with ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError

Буду благодарен любому решению, перелопатил уже весь интернет.
  • Вопрос задан
  • 2299 просмотров
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
Я даже никогда не задумывался, что можно придумать ставить в очередь экшены контроллеров. Это ж даже в определение не укладывается. Фоновая задача = очередь [конкретных] задач. А экше контроллера может, в зависимости от контекста, как стать произвольной задачей (или множеством произвольных задач), так и отсутствием задач.

Короче, самую тяжелую логику в модель. Желательно, в один ее метод. И в тот момент, когда контроллеру нужно будет сделать синхронный вариант, делаете его асинхронным. Все. Никаких стронг-парамс, хелперов, вьюх и т.д.

UPD. Модель есть, уже проще.
У вас в синхронном виде все работает для начала?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы