首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails before_action需要很长时间

Rails before_action需要很长时间
EN

Stack Overflow用户
提问于 2015-10-21 17:49:42
回答 1查看 253关注 0票数 1

我在我的Controller类中使用了类似这样的东西:

代码语言:javascript
运行
复制
before_action :do_something, only: [:new, :create]

def new
   @myModel = MyModel.new
end

def create
   @myModel = MyModel.create_with_data(params)

   respond_to do |format|
     if @myModel.errors.empty?
        format.html { redirect_to @myModel, notice: 'MyModel was successfully created.' }
        format.json { render :show, status: :created, location: @myModel }
     else
        logger.error 'MyModelController: Creating mymodel failed!'
        format.html { render :new }
        format.json { render json: @myModel.errors, status: :unprocessable_entity }
     end
end

def do_something
   # Very long method
end

现在,问题是,我的do_something方法需要很长时间才能执行。如果用户在创建新myModel字段时出错,他将需要等待此方法执行,只是为了显示一些错误。

比方说,我不想要前端验证,也不能减少do_something方法的时间。我如何从do_something传递在new方法被调用之前执行的数据,这样它就不需要在create方法之前再次执行?

EN

回答 1

Stack Overflow用户

发布于 2015-10-21 18:27:22

我会考虑使用一种乐观的储蓄方法。就像通常对待未经确认的用户一样。

您在数据库中插入了记录,但是设置了一个状态,表示它不是一个完整的记录。然后,在确认记录时对其进行更新。

它可以为用户提供快速反馈,您可以将web流程从等待do_something的状态中解放出来。

代码语言:javascript
运行
复制
class MyModel < ActiveRecord::Base
  # create an Int column named status
  # make sure it has an index and defaults to 0.
  enum status: [:unverified, :verified]
end

所以,你可以在你的控制器中做这样的事情:

代码语言:javascript
运行
复制
def create
  # Don't do params assignment / whitelisting in your models.
  # models should not be aware of parameters.
  @my_model = MyModel.new(my_model_params) do |m|
    # This should be handled by the DB default but 
    # this is a belt and suspenders approach to be 200% sure
    # that a record does not slip through.
    m.unverified!
  end

  if @my_model.save
    MyModelVerificationJob.perform_later(@my_model)
    respond_to do |format|
      format.html do
        flash[:notice] = "We are currently verifying..."
        redirect_to :edit, @my_model
      end
      # ...
    end
  else
    # we already know something is fishy so just render the 
    # form again.
    respond_to do |format|
      # ...
    end
  end
end 

private
  def my_model_params
    params.require(:my_model).permit(...)
  end

这个示例使用的是Rails 5 Active Jobs,但您也可以查看Resque或Sidekiq。

如何准确地处理来自do_something方法的回调取决于需要什么样的用户交互。例如,如果用户需要更正表单,您可以缓存后台作业的结果,并提示用户访问他们更正表单的页面。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33256048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档