为什么控制器没有捕获错误

我试图从控制器中的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一个方法,它引发了一些exception,这些exception也没有得到处理。

回溯:

 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 | 

它看起来正确地捕获错误,我想知道真正的问题是否是救援声明中的代码的排序。 尝试在渲染调用之前设置闪光灯。

 rescue ActiveRecord::RecordNotFound => e flash[:error] = e.message format.html { render :show } end 

对我来说,看起来你返回的是error.message而不是render语句。 同样,您也可以尝试render :show, flash: { error: e.message }

respond_to块捕获exception时,exception处理开始工作。

我也定义了自己的exception,但这对结果没有影响。

 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