現状、下記のコードで動いております。
■users_controller.rb
@user = User.find_by(name: params[:name]) @posts = Post.where(user_id: @user.id).select(:id,:sort,:title).order(:sort).limit(4).offset(0)
この後、redis、sidekiq、sinatraを導入、テスト版がうまく動いているのを確認して、上記の既存コードを非同期にしようと、"rails g sidekiq:worker Article"をした上で、下記を試しました。
■users_controller.rb
@posts = ArticleWorker.perform_async(params)
■article_worker.rb
class ArticleWorker include Sidekiq::Worker def perform(params) user = User.find_by(name: params[:name]) Post.where(user_id: user.id).select(:id,:sort,:title).order(:sort).limit(4).offset(0) end end
しかし、undefined methodとなり、うまく動作しない状態です。ちなみに、viewは下記となります。
■show.html.erb
<% @posts.each do |post| %> <h4><%= post.title %></h4> <%= render 'form', {user: @user, num: post.sort} %> <% end %>
なお、form内は下記となります。
■_form.html.erb
<% user.posts.each_with_index do |post,i| %> <% if post.sort == num %> <% page = MetaInspector.new(post.url1) %> 以下略
おそらく、根本的に誤解をしていると思うのですが、解決の方向性にも検討がつきません。なお、非同期にしたい理由は、スクレイピング処理が非常に時間が掛かってしまっているからです。つまり、sidekiqで非同期処理したいのは、MetaInspector(NokogiriやMechanizeに似たスクレイピング系gem)の処理です。ただ、この部分だけを非同期にするよりも、大元の上記<% @posts.each do |post| %>に関わる部分をまとめて非同期にした方が良いのかなと思い、現状のような方向性で書いております。どうぞよろしくお願いいたします。
----------追記------------