Пользовательские маршруты и декларативная авторизация

Не знаю, был ли ответ на этот вопрос раньше.

Иметь настраиваемые маршруты к пользователям. Если я обращаюсь к пользователю напрямую /users/5, все работает. Если я попробую /profile или даже /users/current_user с декларативной авторизацией, я получу сообщение «Не удалось найти пользователя без идентификатора».

map.profile "profile", :controller => "users", :action => "show"
map.edit_profile 'profile/edit', :controller => 'users', :action => 'edit', :conditions => { :method => :get }

Мой ApplicationController имеет

перед_фильтром { |с| Authorization.current_user = c.current_user }

и у моих author_rules есть user.id, а также пробовал current_user.id.

role :user do
    includes :guest
    has_permission_on :users, :to => [:show, :edit ] do
    if_attribute :id => is { user.id }
  end
end

Что я делаю неправильно?


person pcasa    schedule 05.06.2010    source источник


Ответы (2)


Для маршрутов с пользовательским типом индекса используйте
filter_access_to :all

Вместо
filter_resource_access

получил меня тоже.

person maxcobmara    schedule 05.05.2011

Я использую AuthLogic, но, насколько мне известно, «current_user» не будет доступен через маршрут.

Вам нужно будет проверить в контроллере, если params[:id] == "current_user" (в виде строки), а затем выполнить некоторую логику на основе этого... т.е.:

if params[:id] == "current_user"
  @user_id = current_user.id
else
  @user_id = params[:id]
end
@user = User.find(@user_id)

Очень упрощенный пример, но он должен иллюстрировать тип логики, который вам понадобится для получения current_user из пользовательского маршрута. Вы также можете просто сопоставить именованный маршрут для current_user с его собственным действием контроллера, но это не очень RESTful и [скорее всего] будет дублировать функциональность, которая у вас уже есть.

person Robbie    schedule 05.06.2010
comment
Вылетело из головы, и я хотел спросить: есть ли какая-то конкретная причина, которая помешала бы вам просто использовать user_path(current_user.id) для создания ссылок? Или требуется доступ к URL-адресу для current_user? - person Robbie; 06.06.2010
comment
на самом деле пытается НЕ использовать current_user в путях/URL-адресах. для пользователя, чтобы добраться до своего домашнего пути, это будет /profile, а редактирование будет /profile/edit и т. д. Теперь проблема заключается в том, что декларативной авторизации требуется доступ к идентификатору пользователя, я думаю, из маршрута URL. Не совсем уверен, поэтому и спрашиваю. - person pcasa; 06.06.2010