T
T
The Whiz2015-02-27 14:56:32
Ruby on Rails
The Whiz, 2015-02-27 14:56:32

How to move create to background task?

I'm trying to move the create action to the background using delayed job, but I can't figure out how to act with strong params. First I tried to do everything in the controller:

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

The task fails because it does not understand what link_share_params is.
Then I tried to connect the model:
Controller:
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
Буду благодарен любому решению, перелопатил уже весь интернет.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Viktor Vsk, 2015-02-27
@viktorvsk

Я даже никогда не задумывался, что можно придумать ставить в очередь экшены контроллеров. Это ж даже в определение не укладывается. Фоновая задача = очередь [конкретных] задач. А экше контроллера может, в зависимости от контекста, как стать произвольной задачей (или множеством произвольных задач), так и отсутствием задач.
Короче, самую тяжелую логику в модель. Желательно, в один ее метод. И в тот момент, когда контроллеру нужно будет сделать синхронный вариант, делаете его асинхронным. Все. Никаких стронг-парамс, хелперов, вьюх и т.д.
UPD. Модель есть, уже проще.
У вас в синхронном виде все работает для начала?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question