2010-05-20 2 views
0

Possible en double:
before_filter :require_ownercode require_owner pour limiter les actions du contrôleur ne reconnaît pas l'utilisateur actuel en tant que propriétaire

Je suis en train de restreindre l'accès à certaines actions en utilisant un before_filter qui semble assez facile. D'une certaine manière, ApplicationController ne reconnaît pas que current_user est le propriétaire de l'action d'édition de l'utilisateur. Lorsque je retire le filtre, le contrôleur route correctement l'utilisateur current_user vers ses informations d'affichage d'édition. Voici le code.

Lien appeler l'action d'édition du contrôleur de l'utilisateur (views/questions/index.html.erb):

<%= link_to "Edit Profile", edit_user_path(:current) %> 

ApplicationController (je signale que le code que je pense affecte cela, mais peut poster tout ça si nécessaire).

class ApplicationController < ActionController::Base 

    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 
end 

et before_filter

class UsersController < ApplicationController 

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

#... 

end 

je reçois simplement le rendu du message d'erreur de la ApplicationController action no de require_owner.

MISE À JOUR: le link_to fournit cette adresse: localhost: 3000/utilisateurs/actuels/modifier

+0

Comment ressemble le lien 'edit_user_path (: current)'? – Eimantas

+0

Bonne question. Comme ceci: http: // localhost: 3000/users/current/edit – bgadoci

Répondre

1

Ok, ceci est la deuxième question de la prime que j'ai posté, puis j'ai répondu moi-même. Les deux fois j'ai trouvé la réponse dans une heure de mon poste de primes. Ha.

J'ai simplement changé la méthode du filtre avant pour que cela fonctionne. J'ai quitté le contrôleur d'application comme dans le code ci-dessus mais dans le UsersController (le seul qui ne coopérait pas) je l'ai fait ce qui suit:

before_filter :require_user, :only => [:edit, :update, :destroy] # all actions require user to be logged in 
    before_filter :init_data  # create a member variable called @post, initialized based on the action 
    before_filter :require_user_owner, :only => [:edit, :update, :destroy] #edit, update, and destroy actions require ownership 

puis

private 

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

qui semblait fais le.

0

me semble que l'appel ont current_user_is_owner?(obj) un problème. Pour le prouver, modifier le code pour:

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

Vous pouvez coller la méthode current_user_is_owner?.

Espérons que cela aide.

+0

J'ai remplacé le code require_owner dans le contrôleur d'application avec le code que vous avez fourni ci-dessus mais ne fonctionnait pas. Même résultat que l'autre code. Peut-être que le problème est dans le lien lui-même. – bgadoci

Questions connexes