今天我尝试使用一个很好的回调: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
答案 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: :show
,only
,您可以指定log_activity
将运行的操作。如果未指定任何内容,则它将在控制器中定义的每个操作之后运行。