My Rails 3应用程序为我的Devise + OmniAuth集成提供了三个自定义控制器。对于用户注册和会话,我需要覆盖标准方法,如“new”。我特别需要控制器方法来处理与JSON格式兼容的重定向和响应。
在我的routes.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 idiom。
有没有人知道我可以用来实现这种情况的任何路由魔法?
答案 0 :(得分:0)
我找到了一个不一定令人满意的答案,但它确实有效。我在routes.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
它比我喜欢的更冗长,而且不是很干,但它确实有用。