Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 需要很长时间的操作之前的Rails_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 需要很长时间的操作之前的Rails

Ruby on rails 需要很长时间的操作之前的Rails,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在我的Controller课程中使用了类似的东西: before\u action:do\u something,only:[:new,:create] def新 @myModel=myModel.new 结束 def创建 @myModel=myModel。使用_数据(参数)创建_ 回应待办事项|格式| 如果@myModel.errors.empty? format.html{将_重定向到@myModel,注意:'myModel已成功创建。} format.json{render:show,s

我在我的
Controller
课程中使用了类似的东西:

before\u action:do\u something,only:[:new,:create]
def新
@myModel=myModel.new
结束
def创建
@myModel=myModel。使用_数据(参数)创建_
回应待办事项|格式|
如果@myModel.errors.empty?
format.html{将_重定向到@myModel,注意:'myModel已成功创建。}
format.json{render:show,status::created,location:@myModel}
其他的
logger.error“MyModelController:创建mymodel失败!”
format.html{render:new}
format.json{render json:@myModel.errors,status::unprocessable_entity}
结束
结束
做点什么
#超长法
结束
现在的问题是,我的
dou\u something
方法需要很长时间才能执行。如果用户在创建新的
myModel
字段时出错,他将需要等待此方法执行,以显示一些错误


比方说,我不需要前端验证,也不能缩短
dou_something
方法的时间。我如何通过某种方式从<代码> dothOuts<代码> >之前执行代码> > < <代码> >方法,因此在“代码> >创建< /COD>方法>

< p>之前,不需要再次执行,我会考虑使用乐观的保存方法来代替。很像未经确认的用户通常被如何对待

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

它为用户提供快速反馈,您可以将web进程从等待
do\u something
中解放出来

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
这个例子是Rails 5的,但您也可以查看Resque或Sidekiq


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

您可以添加有关要传递的数据的更多信息吗?(大小、形式等)您可以从do_将其保存到DBData中,因为其中包含大型ruby对象的集合。这是一个很有希望的答案。我需要检查一下。当然这取决于做某事的速度有多慢。如果你能忍受15毫秒的dyno,反应稍微慢一点,那就不值得大惊小怪了。但是,如果它是重要的,您将希望在后台进行研究。编辑后,我在模型中使用了
state
,在控制器中使用了
status
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