2010-04-13 1 views
2

Я хочу скрыть URL-адреса для редактирования пользователей и их профилей за более безопасными и содержательными URL-адресами. Например, я хочу, чтобы /user/13/edit был /settings/account и /user/13/profile/edit был /settings/profile.Рельсы: Как производить 404 или перенаправлять при нежелательном использовании URL?

Мне это удалось, но для этого мне пришлось загрузить информацию пользователя из разряда current_user из сеанса. Как так:

# users_controller 
def edit 
    @user = current_user 
end 

# profiles_controller 
def edit 
    @user = current_user 
    @profile = @user.profile 
end 

Но теперь, так как я не могу сравнить @user.id из params с current_user в сессии, как я могу остановить старые URLs (/user/13/edit и /user/13/profile/edit) от того годный для использования? Они всегда загружают формы для текущего пользователя, поэтому нет никакого вреда, но мне было бы более комфортно, если бы они только что выпустили ошибку 404 или что-то в этом роде.

Заранее спасибо.

ответ

1

Прежде всего, вашему механизму аутентификации необходимо установить текущего пользователя.

routes.rb

map.account '/settings/account', :controller => 'user', :action => 'edit' 
map.profile '/settings/profile', :controller => 'user', :action => 'edit_profile' 

map.resources :users, :only => [:edit, :update, :show], 
       :member => { :edit_profile => :get, :update_profile, :put } 

это производит следующие маршруты:

/settings/account   (get) 
/settings/profile   (get) 
/users/:id    (get, put) 
/users/:id/edit   (get) 
/users/:id/edit_profile (get) 
/users/:id/update_profile (put) 

users_controller.rb

before_filter :redirect_if_unauthorized 

def edit 
    @user = current_user 
end 

# profiles_controller 
def edit 
    @user = current_user 
    @profile = @user.profile 
end 

protected 

def redirect_if_unauthorized 
    redirect_to some_path if params[:id] or current_user.nil? 
end 

Очевидно some_path не существует, вам придется создать страницу/path и т. д., чтобы отобразить ошибку.

С помощью этого решения вы никогда не показываете/не манипулируете пользователем на основе параметров [: id], а только текущий_супер, сохраненный в вашей схеме аутентификации.


Я мог бы также предложить глядя на declarative_authorization гем/плагин (Github, Railscast)

+0

Моя проблема в том, что новые URL-адреса не предоставляют параметры, которые я могу использовать для сравнения. –

+0

Я сделал некоторые изменения, это ближе к тому, что вы ищете? –

+0

Я пробовал адаптировать ваше решение к своему коду, но не смог заставить его работать. Теперь я буду смотреть в плагин. Спасибо за помощь. –

0

/Изменить URLs все еще существуют, потому что я держу пари, что у вас есть map.resources в вашем routes.rb файле для модели пользователя. вы можете поместить строку выше, чем в файле routes.rb, который явно соответствует строкам редактирования, которые вы хотите перенаправить, и укажите их там, где хотите.