2012-05-15 3 views
0

Мой код для пост-контроллера выглядит следующим образом. Что я пытаюсь сделать, так это то, что пользователь должен иметь возможность удалять свои собственные сообщения, а admin_user может удалять любые сообщения. Следующий код заставляет admin_user удалять сообщения, но для обычного пользователя при попытке удалить свой собственный пост он перенаправляется на root_pathкак запустить два метода в before_filter?

Кажется, что do_authentication не работает должным образом, обычный пользователь пытается пройти аутентификацию в качестве администратора вместо «correct_user»

Что может быть неправильным?

Спасибо!

class PostsController < ApplicationController 
    before_filter :signed_in_user, only: [:index, :create, :destroy] 
    before_filter :do_authentication, only: :destroy 
    . 
    . 
    . 
def destroy 
    @post.destroy 
    flash[:success] = "Post deleted!" 
    redirect_back_or user_path(current_user) 
end 

private 
    def do_authentication 
    correct_user || admin_user 
    end 

    def correct_user 
    @post = current_user.posts.find_by_id(params[:id]) 
    redirect_to user_path(current_user) if @post.nil? 
    end 

    def admin_user 
    @post = Post.find_by_id(params[:id]) 
    redirect_to(root_path) unless current_user.admin? 
    end 

ответ

0

Прежде всего, я бы предложил использовать cancan для авторизации. Я думаю, что ваша проблема - это возвращаемое значение correct_user. Вы не контролируете это. Если этот метод возвращает то, что оценивается как false, метод do_authentication также вызывает admin_user. Кроме того, глядя на ваш код, кажется, что разрешение администратора не будет работать также ...

попробовать это:

def do_authentication 
    @post = Post.find_by_id(params[:id]) 
    redirect_to redirect_location unless current_user.admin? or @post.user == current_user 
end 

def redirect_location 
    return "redirect_location_for_admin" if current_user.admin? 
    return "redirect_location_for_non_admins" 
end 
+0

спасибо. Я наконец нашел способ, который работает. На самом деле проще, чем я думал, частный def do_authentication if current_user.admin? @ post = Post.find_by_id (params [: id]) else @ post = current_user.posts.find_by_id (params [: id]) redirect_to user_path (current_user), если @ post.nil? конец конец – alexZ

0

методы correct_user, admin_user будет выполняться для всех пользователей независимо от их роли, потому что вы не проверяли какое-либо условие при вызове методов. Код должен быть улучшен для решения вашей проблемы.

def do_authentication 
    if current_user.admin? 
    @post = Post.find_by_id(params[:id]) 
    else 
    @post = current_user.posts.find_by_id(params[:id]) 
    redirect_to user_path(current_user), :notice => "Access denied" unless @post 
    end 
end