【问题标题】:Rails calling redirect_to (or render) outside controllerRails 在控制器外部调用 redirect_to(或渲染)
【发布时间】:2019-03-04 06:55:01
【问题描述】:

这似乎是一个微不足道的问题,但我似乎无法在任何地方找到答案(这可能是因为 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'

我什至尝试过这种可怕的 hack:

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

【问题讨论】:

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


    【解决方案1】:

    对于那些投反对票的人,他的回答至少解释了他投反对票的原因。

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

    我知道这可能不是您正在寻找的答案,但它比没有解释的否决票要好。

    另外,如果您正在上传和处理图像,您应该查看

    jQuery File Uploads

    Railscasts #381 jQuery File Upload

    Railscasts #383 Uploading to Amazon S3

    【讨论】:

    • 我做后台工作的原因是因为它将托管在 Heroku 上(它非常明确地告诉您将上传作为后台进程运行)。我并不完全喜欢它目前的布局方式,但现在用户会有一个不错的小加载器 .gif 来让他们保持忙碌并知道它正在处理。我想渲染一个部分,以便它会随着后台任务更新(完成处理......现在正在加载......等等)我已经看过这两个 railscast,并且之前使用过 jQuery 文件上传器,它们很好,但我正在尝试使用 sidekiq。
    • 这有点不同,我也在尝试使用回形针。总的来说,有点不同,最后因为它有点违反“铁轨规则”,它可能不起作用。我想我会在去之前在这里尝试并重新考虑所有内容。
    【解决方案2】:

    你需要控制器实例的深处,所以你可以:

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

    • 那你可以拨打Thread.current[:controller].redirect_to

    我知道,这太骇人听闻了。我没有尝试过,但我们为User.current 做了类似的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 2015-01-31
      • 1970-01-01
      • 2014-08-19
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多