2014-12-04 2 views
0

Hi все новичок вопрос.Как создать класс помощника контроллера действий и как получить доступ к нему в действии контроллера?

Я создаю одно приложение rails, где после отображения результата пользователю мне нужно выполнить некоторые другие операции в фоновом режиме для обновления базы данных.

(жаль, что я беден при объяснении вещей, увидеть мой пример кода для ситуации)

В действии моего контроллера я использую сторонних API для получения данных с удаленного сервера. После отображения данных, полученных пользователем, я хочу обновить таблицу базы данных с помощью настроенных данных по извлеченным данным.

class MyController < ApplicationController 
def SomeAction 
    #some logic 
    @result = FetchDataFromApi#Using third party api to fetch huge data 
    #show result to user 
    #after showing i need to do following operations elsewhere (controller helper) 
    #based on some fetched result i want to update my table 
    myId = @result.id 
    dataObj = MyModel.find(myId) 
    info = @result.information.gsub(',',' ') #some string operation 
    dataObj.update_attributes(:info, info) 
end 
end 

я могу использовать spawnling камень выполнить дополнительную работу после того, как показывает результат пользователю. Но мне просто интересно, могу ли я сделать это с помощью помощника или других вещей с рельсами.

+0

Если вам нужно запустить что-нибудь в качестве фона вы необходимо использовать sidekiq или аналогичный инструмент. – BroiSatse

+0

@BroiSatse есть побочные эффекты с помощником actioncontroller? – Aparichith

+0

Помощники ActionCOntroller - это мост между контроллером и представлением, если у вас нет другого смысла. Ответ всегда отправляется как последний шаг жизненного цикла запроса, поэтому любой нефонический код должен будет завершить выполнение до отправки ответа. Вы можете попробовать использовать потоки, но это доказывает больше проблем. Sidekiq - это решение, которое я использовал во всех моих проектах, и, похоже, это правильно. – BroiSatse

ответ

0

Хотя бывают случаи, когда имеет смысл использовать обработку фона. Это не один из них.

Я предполагаю, что «показать результат пользователю» означает рендеринг некоторого шаблона на основе данных, полученных из api.

На самом деле, было бы неплохо перейти к внешнему API-интерфейсу, но это потребует изменения потока. Что касается обновления записи db, то, как правило, не рекомендуется перемещать ее на задний план.

, как говорится, я бы не стал делать обновления в контроллере, я бы переместить его в модель или «мутации» класса:

class Model 
    def self.update_from_api 
    res = API.fetch ... 
    object = find res.id 
    object.update_from_api! res 
    res 
    end 

    def update_from_api(api_data) 
    update_attributes! info: api_data.gsub(....) 
    end 
end 
+0

спасибо за предложение. Я попробую ваше предложение и дам вам знать. – Aparichith

Смежные вопросы