如何为Rails 3中的自定义Devise控制器设置默认格式(如JSON)?

时间:2011-01-20 23:27:46

标签: json ruby-on-rails-3 devise

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。

有没有人知道我可以用来实现这种情况的任何路由魔法?

1 个答案:

答案 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

它比我喜欢的更冗长,而且不是很干,但它确实有用。