2013-06-27 27 views
10
  1. 巢資源時,應在devise_for塊我窩路線?請給出一個或兩個示例來顯示用例。 (路線#1)Rails3中+設計:當在devise_for和嵌套資源

  2. 如果:foo_object:users所以:user HAS_ONE :foo_object有關,我需要窩:foo_object:users下? (路線#2):users是設計:users模型。

路線#1:

devise_for :users 
resource :foo_object 

路線#2:

devise_for :users 
resources :users do  
    resource :foo_object 
end 

回答

23

下面的例子:上述

devise_for :users, :path => 'accounts' 

resources :users do 
    resources :orders 
end 

意味着認證路徑將是"/accounts/sign_in""/accounts_sign_up"等。有些可能不知道,重要的是承認devise_for :users不是實際上映射到UsersController和模型。它甚至不是一條資源路線,儘管它看起來很像它。這就是爲什麼我們不能把它像下面這樣:

devise_for :users do 
    resources: somereosouce 
end 

所有devise_for所做的是以下路線圖:

# Session routes for Authenticatable (default) 
    new_user_session GET /users/sign_in     {:controller=>"devise/sessions", :action=>"new"} 
     user_session POST /users/sign_in     {:controller=>"devise/sessions", :action=>"create"} 
destroy_user_session GET /users/sign_out     {:controller=>"devise/sessions", :action=>"destroy"} 

# Password routes for Recoverable, if User model has :recoverable configured 
    new_user_password GET /users/password/new(.:format)  {:controller=>"devise/passwords", :action=>"new"} 
    edit_user_password GET /users/password/edit(.:format) {:controller=>"devise/passwords", :action=>"edit"} 
     user_password PUT /users/password(.:format)   {:controller=>"devise/passwords", :action=>"update"} 
         POST /users/password(.:format)   {:controller=>"devise/passwords", :action=>"create"} 

# Confirmation routes for Confirmable, if User model has :confirmable configured 
new_user_confirmation GET /users/confirmation/new(.:format) {:controller=>"devise/confirmations", :action=>"new"} 
    user_confirmation GET /users/confirmation(.:format)  {:controller=>"devise/confirmations", :action=>"show"} 
         POST /users/confirmation(.:format)  {:controller=>"devise/confirmations", :action=>"create"} 

所以說,你可以做到以下幾點,但會有些衝突:

devise_for :users 

resource :users do 
    resource :foo_object 
end 

嵌套資源一點點,如果你有類似以下內容:

class Users < ActiveRecord::Base 
    has_many :foo_object 
end 

class FooObject < ActiveRecord::Base 
    belongs_to :users 
end 

那麼你的嵌套的資源將

resource :users do 
    resource :foo_object 
    end 

希望這將清除的東西了。你可能還需要有Nested Resource with Devise - Rails3

+2

感謝澄清'devise_for'問題一讀。我讀過的最好的解釋! – HM1

+0

對於化合物Q#2,我知道這就是我會做窩的資源......我想問題更是必要,或者我必須巢關聯模型這種情況下的資源?因爲在這種情況下,我可以在控制器中使用'current_user'並構建/更新':foo_object'模型。我想知道是否有這樣做的後果。 – HM1

+1

@ HM1它不是完全必要的,但如果你想定義一些邏輯你的應用程序,那麼是的。它是分組資源的一種更簡潔的方式。然而,在你的情況下,你知道'user'與'foo_object'關聯。所以,當你執行一個'user'你會執行動作'foo_object'也是一種行動。所以,你的網址可能會看起來像這樣的事'/用戶/ 3/foo_object/4'另一個原因,就必須有嵌套的路線是因爲它的Rails中的重要原則REST風格之一。 – David