2012-04-19 5 views
1

Так у меня есть 3 типа пользователей:Rails разрешить доступ к одной странице, не ограничивая весь контроллер

admin 
moderator 
regular user 

У меня есть модератор и администратор страницы заблокированной с контроллером для всей системы, как это:

def authorize 
    unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).moderator == true 
    redirect_to login_url, :notice => "Please log in with a moderator account" 
    end 
end 

def authorize_admin 
    unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).admin == 1 
    redirect_to login_url, :notice => "Only admins can access the page you tried to access" 
    end 
end 

Но мне нужно предоставить доступ к обычным пользователям на страницах редактирования (и, конечно, действия обновления) нескольких контроллеров. Но просто отредактируйте и обновите.

Если я:

before_filter :authorize, :except => :edit 

Тогда любой (даже если они не вошли в систему) имеет доступ к этим страницам.

Как бы я мог сделать что-то подобное?

Редактировать

По предложению Тило, я добавил следующее в файл application_controller.erb:

def update_successful 
    skip_before_filter :authorize 
    end 

Чтобы иметь возможность обслуживать update_successful страницу после того, как обычный пользователь редактирует запись , Однако я получаю эту ошибку:

undefined method `skip_before_filter' for #<HomeController:0x007ff782aeb6f0> 
+0

Как вы используете эти два метода? Как 'before_filter'? – Thilo

+0

Да, before_filter. – kakubei

ответ

1

Вы можете пропустить любой глобально применяется фильтр в явном виде:

skip_before_filter :authorize, :only => [:edit, :update] 

Или не применять его к соответствующим действиям в первую очередь:

before_filter :authorize, :except => [:edit, :update] 

EDIT

Чтобы ответить на ваши дальнейшие вопросы Тион: Добавьте это к контроллеру приложения:

def upload_successful 
end 

Это пустой метод, который явно определяет действие, которое до сих пор, как был неявно используется Rails при визуализации home/upload_successful.html.haml шаблона. Затем удалите аутентификацию из этого метода путем изменения фильтра:

before_filter :authorize, :except => [:upload_successful] 

Вот в Rails хороший introduction to rendering - это помогает понять рендеринг по умолчанию, который является то, что отображается ваш upload_successful шаблон без контроллера или действий согласования определены.

+0

Но таким образом каждый может видеть эти страницы, даже не имея учетной записи. Я сделал то, что вы предлагаете, а также добавил 'before_filter: authorize_user' (который проверяет, что обычный пользователь входит в систему) каждому контроллеру, который имеет методы редактирования и обновления. Не уверен, что это правильный способ сделать это, все еще имея некоторые проблемы с этим. – kakubei

+0

Кроме того, у меня есть страница, на которой я хочу, чтобы обычные пользователи были перенаправлены после успешного обновления. Я попытался поставить: 'skip_before_filter: authorize' в представлении (шаблон haml), но это, похоже, не работает. Это обычная страница, которая находится в директории «home» без контроллера. Как я могу позволить им получить доступ к этой странице?(спасибо за ответы BTW). – kakubei

+0

Фильтры идут на контроллерах, и каждое действие имеет один - если не явно, то по умолчанию 'ApplicationController'. Просто добавьте (пустой) метод к этому с именем вашей страницы и установите для этого фильтр. – Thilo

Смежные вопросы