Как установить формат по умолчанию, например JSON, для настроенного контроллера Devise в Rails 3? - PullRequest
1 голос
/ 21 января 2011

Приложение My Rails 3 имеет три настраиваемых контроллера для интеграции с Devise + OmniAuth. Мне нужно было переопределить стандартные методы, такие как «новый», для регистрации пользователей и сессий. Мне особенно нужны были методы контроллера для обработки перенаправлений и ответов, которые совместимы с форматированием JSON.

В моем файле rout.rb есть следующее:

devise_for :users, :controllers => { 
      :omniauth_callbacks => "users/omniauth_callbacks", 
      :registrations      => "users/registrations", 
      :sessions           => "users/sessions"
}

Это работает, как ожидалось. Мои маршруты теперь показывают маршруты пользовательских контроллеров, такие как:

new_user_session GET  /users/sign_in(.:format) {
      :action      =>"new", 
      :controller  =>"users/sessions"
}

new_user_registration GET /users/sign_up(.:format) {
      :action=>"new", 
      :controller=>"users/registrations"
}

Чтобы установить формат по умолчанию для ресурса, я бы сделал что-то вроде этого:

resources :users, :defaults => { 
      :format => 'json' 
}

Итак, я попробовал это:

namespace "users" do
  resources :registrations, :defaults => { 
      :format => 'json' }
  resources :sessions, :defaults => { 
      :format => 'json' }
end

Что не сработало, как ожидалось. Я закончил с этими маршрутами:

new_users_registration GET /users/registrations/new(.:format) {
      :format=>"json", 
      :action=>"new", 
      :controller=>"users/registrations"
}

new_users_session GET /users/sessions/new(.:format) {
      :format=>"json", 
      :action=>"new", 
      :controller=>"users/sessions"
}

Чтобы это работало с моими пользовательскими переопределениями в Devise, мне нужно отформатировать «new_user_registration», а не «new_users_registration».

Я проверил метод devise_for, и у него нет опции: defaults. Я могу использовать метод devise_scope для установки отдельных маршрутов, но это выглядит гораздо менее лаконично, чем идиома: defaults.

Кто-нибудь знает какую-либо магию маршрутизации, которую я могу использовать, чтобы это произошло?

1 Ответ

0 голосов
/ 21 января 2011

Я нашел ответ, который не обязательно удовлетворяет, но он работает.Я попробовал это в rout.rb:

devise_scope :user do
 get "sign_up", :to => "users/registrations#new", 
                :defaults => { :format => 'json' }
end

И я попробовал это в моих пользовательских контроллерах:

redirect_to new_user_registration_url, :format => 'json'

Ни один не работал.Я предполагаю, что оба из них были неверны в реализации.Наконец-то я использовал это в своих пользовательских контроллерах:

redirect_to :controller => 'users/registrations', 
            :action => 'new', 
            :format => 'json'

Это заменило везде, где у меня изначально было:

redirect_to new_user_registration_url

Это более многословно, чем мне нравится, и не очень СУХОЕ, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...