2013-06-27 4 views
10
  1. Когда я должен устанавливать маршруты в блоке devise_for? Пожалуйста, дайте один или два примера, чтобы показать пример использования. (Маршруты # 1)Rails3 + Devise: Когда гнездиться ресурс в 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'. Так что, когда вы выполняете действие с «пользователем», вы также выполняете действие 'foo_object'. Таким образом, ваш URL-адрес потенциально будет похож на этот '/ users/3/foo_object/4'. Еще одна причина, по которой необходимо иметь вложенные маршруты, потому что его RESTful является одним из важных принципов в Rails. – David