在Rails 5的控制器中使用什么而不是after_commit?

Ale*_*org 0 ruby controller callback ruby-on-rails-5

今天我尝试使用一个很好的回调:after_commit在对象写入数据库时​​触发,但是,我收到了来自Rails的错误消息:

ActionController::RoutingError (undefined method `after_commit' for ImagesController:Class
Did you mean?  after_action):
Run Code Online (Sandbox Code Playgroud)

嗯,这很令人尴尬!似乎这个回调被弃用了!通过搜索,我尝试使用:after_create_commit,它给了我同样的错误.

第三步是尝试:after_action.这里提出了一个问题: 如何使其工作方式与:after_commit?

我已经尝试过apidock.com - 它真的很小!我也尝试过api.rubyonrails.org - 它是关于块的,但我不是一个了解它的红宝石忍者.所以我真的很感激你是否可以在它上面洒一些光!

ImagesController:

class ImagesController < ApplicationController
  after_create_commit :take_image_to_album

  def take_image_to_album
    if check_album
      add_inner_to_album(@image)
    end
  end

  def create
    @image = Image.create(image_params.merge(:user_id => current_user.id)

    respond_to do |format|
      unless @image.save
        format.html { render :show, notice: "Error!" }
        format.json { render json: @image.errors, status: :unprocessable_entity }
      else
        format.html
        format.json { render :show, status: :ok, location: @image }
      end
    end
  end
  ...

  def add_inner_to_album(image)
    contents = @album.content
    contents << [image.id, image[:imageup], false]
    @album.update(:content => contents)
  end
  end
Run Code Online (Sandbox Code Playgroud)

Mat*_*ano 7

after_commit方法仅适用于机型.在控制器系列中,您有after_action,它将在控制器的操作完成后执行.

例如,after_action控制器中的工作方式如下:

class UsersController < ApplicationController
  after_action :log_activity, only: :show

  # GET v3/users/:id
  def show
    render status: :ok,
           json: { id: current_user.id, name: current_user.name }
  end

  def log_activity
    current_user.update(last_activity_at: Time.current)
  end

end
Run Code Online (Sandbox Code Playgroud)

log_activity方法在响应请求后执行.

after_action :log_activity, only: :show,only您可以指定log_activity运行后的操作.如果未指定任何内容,则它将在控制器中定义的每个操作之后运行.