我试图在控制器中解除RecordNotFound错误,如下所示:
def create_user_role
authorize User
role = params[:user][:rolify_role].to_sym
resource_type = params[:user][:resource_type]
resource_id = params[:user][:id]
# Catch RecordNotFound doesn't work
begin
resource = nil
resource = resource_type.constantize.find(resource_id) if RolifyRoles.available_resources.include?(resource_type) && resource_id.present?
rescue ActiveRecord::RecordNotFound => e
format.html { render :show }
flash[:error] = e.message
end
end
当resource_type.constantize.find(resource_id)
无法找到记录时,它不会被救援区抓住。
Completed 500 Internal Server Error in 46ms (ActiveRecord: 3.2ms)
ActiveRecord::RecordNotFound - Couldn't find RequestComment with 'id'=1:
app/controllers/users_controller.rb:58:in `create_user_role'
我尝试使用StandardError
或Exception
进行营救,但结果是相同的。
问题出在哪里?
我也在调用module
中的一种方法,该方法会引发一些例外,这些例外情况也未得到处理。
回溯:
07:23:29 web.1 | Started POST "/users/kru0096/create_user_role" for 10.0.131.29 at 2018-06-13 07:23:29 +0200
07:23:39 web.1 | Processing by UsersController#create_user_role as HTML
07:23:39 web.1 | Parameters: {"utf8"=>"✓", "authenticity_token"=>"5kN6MuoP4YntbTvL5cTDPuCZypDdO
o1KPcvIu8dJ6otX0aYPwuWg64/TTTgDe6DRXn6wCs1KvgT9xjkr9g/dyA==", "user"=>{"rolify_role"=>"hoac", "resource_type"=>"RequestComment", "id"=>"1"}, "commit"=>"", "id"=>"kru0096"}
07:23:39 web.1 | User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
07:23:39 web.1 | User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`login` = 'kru0096' LIMIT 1
07:23:39 web.1 | RequestComment Load (0.3ms) SELECT `request_comments`.* FROM `request_comments` WHERE `request_comments`.`id` = 1 LIMIT 1
07:23:39 web.1 | Completed 500 Internal Server Error in 41ms (ActiveRecord: 6.5ms)
07:23:39 web.1 |
07:23:39 web.1 |
07:23:39 web.1 |
07:23:39 web.1 | ActiveRecord::RecordNotFound - Couldn't find RequestComment with 'id'=1:
07:23:39 web.1 | app/controllers/users_controller.rb:92:in `create_user_role'
07:23:39 web.1 |
答案 0 :(得分:0)
它看起来正确地捕获了错误,我想知道真正的问题是否是救援声明中代码的排序。尝试在渲染调用之前设置闪光灯。
rescue ActiveRecord::RecordNotFound => e
flash[:error] = e.message
format.html { render :show }
end
对我来说,看起来你返回error.message
而不是render语句。同样,您也可以尝试render :show, flash: { error: e.message }
答案 1 :(得分:0)
异常处理在respond_to
块捕获异常时开始工作。
我也定义了自己的异常,但这对结果没有影响。
def create_user_role
authorize User
# Params Inicialization
role = params[:user][:rolify_role].to_sym
resource_type = params[:user][:resource_type]
resource_id = params[:user][:id]
respond_to do |format|
begin
# Make resource as instance of class or set to nil
resource = RolifyRoles.build_resource(resource_type, resource_id)
if @user.add_role role, resource
format.html { redirect_to @user, notice: "Role #{role} was successfully added." }
format.json { render :show, status: :created, location: @user }
else
format.html { render :show }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
# Catch self defined exceptions
rescue RolifyRolesException => e
flash[:error] = e.message
flash.keep
format.html { render :show, flash: { error: e.message } }
format.json { render json: e.message, status: :unprocessable_entity }
end
end
end