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

时间:2017-08-08 19:30:43

标签: ruby callback controller ruby-on-rails-5

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

ActionController::RoutingError (undefined method `after_commit' for ImagesController:Class
Did you mean?  after_action):
嗯,这很令人尴尬!似乎这个回调被弃用了! 通过搜索,我尝试使用: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

1 个答案:

答案 0 :(得分:6)

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

响应请求后执行log_activity方法。

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