2011-01-20 22 views
1

我的Rails 3應用程序爲我的Devise + OmniAuth集成提供了三個自定義控制器。我需要覆蓋用戶註冊和會話的標準方法,比如'new'。我特別需要控制器方法來處理與JSON格式兼容的重定向和響應。如何爲Rails 3中的自定義Devise控制器設置默認格式,如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" 
} 

爲了這個與設計我自定義的替換工作,我需要格式化「new_user_registration」而不是「new_users_registration」。

我檢查了'devise_for'方法,它沒有:defaults選項。我可以使用'devise_scope'方法來設置單個路由,但這似乎不太簡潔:defaults慣用語。

有誰知道我可以用來實現這種情況的任何路由魔法?

回答

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 

這是更詳細的比我喜歡的不是很乾,但是它的工作原理。

相關問題