Rails在控制器外调用redirect_to(或渲染)

时间:2012-12-27 15:19:59

标签: ruby-on-rails-3 model-view-controller rubygems render sidekiq

这似乎是一个微不足道的问题,但我似乎无法在任何地方找到答案(这可能是因为Rails对我正在做的事情不满意。)

我正在使用Sidekiq来处理后台任务(例如图像处理,上传等),还有一个它们已完成我想将当前页面重定向到另一个页面,或者甚至更好地渲染出部分页面。

我在perform方法中的当前代码如下所示:

def perform(entry_id)
        @entry = Entry.find(entry_id)
        #Create, upload image, all stored in @file when complete

        if @file.save
            #render will go here
        else
            raise @file.inspect
        end
    end

所以,我尝试了几种方法,例如:

render 'entry/new'

render :partial => 'entry/partial'

redirect_to @entry, notice: 'File Uploaded'

我甚至试过这个可怕的黑客:

entries_controller.rb

# Called after the background task is completed
def self.done_loading(entry_id)
  @entry = Entry.find(entry_id)
  @entry.update
end

worker.rb

EntriesController.done_loading(entry_id)

我做错了什么?

参考文献(我抬头看的东西): When to use render vs redirect_to when handling error validations

https://gist.github.com/1210155

http://railsforum.com/viewtopic.php?id=16885

2 个答案:

答案 0 :(得分:0)

对于那些投票的人来说,他的答案至少可以解释为什么他会投票。

此外,如果您想在后台作业完成后重定向/渲染,您可以使用回调,但您应该重新考虑这样做。对于用户,他们将上传图像,但由于您将其发送到后台作业,因此您没有具体的时间框架来执行这些图像。如果工作需要2-5分钟来执行怎么办?用户将在5分钟后重定向?

我知道这可能不是你正在寻找的答案,但它比没有解释的投票更好。

另外,如果你正在上传和处理图片,你应该看看

jQuery File Uploads

Railscasts #381 jQuery File Upload

Railscasts #383 Uploading to Amazon S3

答案 1 :(得分:0)

您需要控制器实例深入一些,因此您可以:

  • 在您的ApplicationController中放入代码以将控制器实例存储在线程本地存储中:Thread.current[:controller] = self

  • 然后您可以致电Thread.current[:controller].redirect_to

可怕的是,我知道。我还没有尝试过,但是我们为User.current做了类似的事情。