【问题标题】:Rails3 + Devise: When to nest resource in devise_for & nested resourcesRails3 + Devise:何时在 devise_for 和嵌套资源中嵌套资源
【发布时间】:2013-06-25 08:08:24
【问题描述】:
  1. 什么时候应该在devise_for 块中嵌套路由?请给出一两个例子来展示用例。 (路线 #1)

  2. 如果:foo_object:users 相关联,所以:user has_one :foo_object,是否需要在:users 下嵌套:foo_object? (路线#2):users 是设计:users 模型。

路线#1:

devise_for :users  
resource :foo_object

路线#2:

devise_for :users
resources :users do      
  resource :foo_object
end

【问题讨论】:

    标签: ruby-on-rails devise routes


    【解决方案1】:

    下面的例子:

    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

    【讨论】:

    • 感谢您澄清devise_for 问题。我读过的最好的解释!
    • 对于 Q #2,我知道这就是我要嵌套资源的方法......我想问题更多的是是否有必要或者我是否必须为关联模型嵌套资源这个案例?因为在这种情况下,我可以在控制器中使用current_user 并构建/更新:foo_object 模型。我想知道这样做是否有后果。
    • @HM1 这不是完全必要的,但是如果你想在你的应用程序中定义一些逻辑,那么可以。它是一种更简洁的资源分组方式。但是,在您的情况下,您知道userfoo_object 相关联。因此,当您对 user 执行操作时,您也将执行操作 foo_object。所以你的 URL 可能看起来像这样 /users/3/foo_object/4 需要嵌套路由的另一个原因是它的 RESTful 是 Rails 中的重要原则之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多