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)
该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运行后的操作.如果未指定任何内容,则它将在控制器中定义的每个操作之后运行.
| 归档时间: |
|
| 查看次数: |
710 次 |
| 最近记录: |