1

I have module saved in lib/rolify_roles.rb

module RolifyRoles
  path = File.join(Rails.root, 'config', 'rolify_roles.yml')
  @config = YAML.load_file(path)

  def add_role(role, target = nil)
    raise "Role is not defined!" if RolifyRoles.config[role].nil?
    ...
  end
end

This lib is prepended by models/user.rb which using the add_role method.

Then in controllers/users_controller.rb i have method which uses the add_role method:

  def create_user_role
    authorize User
      role = params[:user][:rolify_role].to_sym
      resource_type = params[:user][:resource_type]
      resource_id = params[:user][:id]

      resource = nil
      resource = resource_type.constantize.find(resource_id) unless resource_type.blank? || resource_id.blank?


      respond_to do |format|
        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: @call.errors, status: :unprocessable_entity }
        end
      end

    # Add_role exceptions
    rescue Exception => e
       format.html { render :show }
       format.json { render json: @call.errors, status: :unprocessable_entity }

  end

I am trying to catch the exception from the module RolifyRoles in the controller method.

But when the exception is raised (Role is not defined!) it ends up in the module and it's not handled by the controller. User#add_role lib/rolify_roles.rb, line 31

How can I handle this behavior in the controller?

Backtrace: enter image description here

Edit:

I've tried to rescue from RecordNotFound error in controller like this:

  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

And when the resource_type.constantize.find(resource_id) cannot find the record, its doesnt raise the rescue block.

 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'
Jan Krupa
  • 484
  • 9
  • 21

1 Answers1

0

I solved catching exception there Why controller does not catch error.

When the exception is caught at the respond_to block, then it works correctly.

Jan Krupa
  • 484
  • 9
  • 21