0

Je semble avoir un hiccup d'autorisation dans mon application Ruby on Rails. J'ai utilisé la méthode suivante dans mon contrôleur d'application et il a fonctionné magnifiquement.Comment gérer un hiccup d'autorisation en raison d'un mauvais nom de contrôleur?

def require_owner 
    obj = instance_variable_get("@#{controller_name.singularize.camelize.underscore}") # LineItem becomes @line_item 
    return true if current_user_is_owner?(obj) 
    render_error_message("You must be the #{controller_name.singularize.camelize} owner to access this page", root_url) 
    return false 
end 

Je puis filtre dans les contrôleurs spécifiques par:

before_filter :require_owner, :only => [:destroy, :update, :edit] 

J'ai récemment créé un nouveau contrôleur qui a un peu d'une convention d'appellation qui semble causer un problème. Normalement mes contrôleurs ont lu messages_controller ou posts_controller. Dans ce cas précis, j'ai nommé la ressource box_wod qui a généré box_wods_controller.

Ceci est le seul contrôleur qui semble avoir un problème avec ce filtre, donc je parie que je peux dire qu'il est dans le nommage et donc la méthode application_controller ne reconnaît pas le propriétaire de l'enregistrement.

Je ne reçois pas un message d'erreur mais l'application ne me laisse pas modifier, mettre à jour ou détruire un enregistrement parce que je ne suis pas le BoxWod owner. Mes itinéraires sont corrects, tout comme mes associations et les informations correctes sont transmises à la table box_wod.

Existe-t-il un moyen de réécrire la méthode application_controller pour reconnaître le trait de soulignement supplémentaire dans la ressource box_wod? Ou est-ce même mon problème?

MISE À JOUR:

Voici les trois méthodes du BoxWodsController:

def edit 
    @workout_count = Workout.count 
    @box_wod = BoxWod.find(params[:id]) 
    end 

    def update 
    @box_wod = BoxWod.find(params[:id]) 

    respond_to do |format| 
     if @box_wod.update_attributes(params[:box_wod]) 
     flash[:notice] = 'BoxWod was successfully updated.' 
     format.html { redirect_to(@box_wod) } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @box_wod.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @box_wod = BoxWod.find(params[:id]) 
    @box_wod.destroy 

    respond_to do |format| 
     format.html { redirect_to(box_wods_url) } 
     format.js 
    end 
    end 
+0

J'ai du mal à avaler que c'est le nom du fichier du contrôleur qui vous cause un problème. Pouvez-vous ajouter les parties pertinentes du contrôleur en question à votre question? – karmajunkie

Répondre

2

Dans des situations comme cela, je souhaite créer une méthode de contrôleur que je peux remplacer si nécessaire. Par exemple:

# application_controller.rb 
class ApplicationController 
    def require_owner 
    obj = instance_variable_get("@#{resource_instance_variable_name}") 
    # Do your authorization stuff 
    end 

    private 

    def resource_instance_variable_name 
    controller_name.singularize.camelize.underscore 
    end 
end 

# box_wods_controller.rb 
class BoxWodsController 
    private 

    def resource_instance_variable_name 
    'box_wod' # Or whatever your instance variable is called 
    end 
end 

Enfin, s'il vous plaît envoyer votre code BoxWodsController afin que nous puissions mieux diagnostiquer le problème.

1

Il semblerait que la variable d'instance @box_wod ne soit pas créée tant que la méthode require_owner n'est pas invoquée, donc current_user_is_owner? vérifie une valeur nulle, ce qui la rend toujours fausse. Peut-être avez-vous besoin d'un autre before_filter pour remplir la variable d'instance avant que require_owner ne soit invoqué.