2010-11-12 81 views
0

在我「的routes.rb」文件我有以下線的子集:如何創建一種資源,是現有資源

resource :users 

,給了我一堆命名路線的訪問我的用戶模型採用REST風格。

現在,我對用戶模型做了一些補充,包括創建一個特殊的用戶類。這些仍然存儲在用戶模型中,但數據庫中有一個「特殊」標誌,將它們標識爲特殊標誌。

那麼,是否有可能創建special_users資源?例如,我希望將「special_users_path」作爲到「/ special_users」的命名路由,當您在URL上執行GET時,它將僅返回特殊用戶的索引。

有沒有辦法做到這一點?

回答

0

在Rails路由, '資源' 指的是用於RESTful資源創建的標準7條路線:indexshownewcreateeditupdatedestroy。通常這就夠了,但有時候你可能想創建另一個動作。

在該模型中,要創建一個scope只返回特定用戶:

class User < ActiveRecord::Base 
    scope :special, where(:special => true) 
end 

在控制器方面,有兩種方式來進行此事。你所建議的是一個額外的行動的創建:

match "https://stackoverflow.com/users/special" => "users#special" 
resource :users 

在控制器,您的專項行動將返回剛纔創建的範圍:那你問什麼

class UsersController < ApplicationController 
    def special 
    @users = User.special 
    end 
end 

,但我會建議不要這樣做。如果您稍後添加其他標誌,您想要搜索?如果你想通過多個標誌搜索怎麼辦?這個解決方案不夠靈活。相反,保持路線會是這樣的:

resource :users 

,只是增加一個額外一行到你的控制器:

class UsersController < ApplicationController 
    def index 
    @users = User.all 
    @users = @users.special if params[:special] 
    end 
end 

而現在,當你想顯示特殊用戶,只需將用戶引導到/users?special=true

這種方法更具前瞻性,IMO。

(這個答案假定Rails-3。如果你還在使用2。3讓我知道)

+0

在第一個示例中沒有必要使用lambda。這將做到:scope:special,where(special:true) – noodl 2010-11-12 01:17:51

+0

@noodl謝謝,仍然習慣於arel。 – 2010-11-12 01:35:52

+0

謝謝!美麗的解釋和我真的很感謝你去麻煩顯示一個替代方法,以及微不足道的情況。 – spinlock 2010-11-12 17:50:14

0

你可以設置special_users作爲一種資源:

resource :special_users 

如果你需要將它指向一個專用控制器,你可以用指定:

resource :special_users, :controller => :users 

但我真的建議你不要創建另一個控制器來檢索一種用戶,但使用param來獲得它們:

class UsersController < ApplicationController 
    def index 
    users = case params[:type].to_s 
       when "special" 
       User.special_users # Using named scopes 
       else 
       User.all 
      end 
    end 
end 

當您使用users_path呼叫特殊用戶時:

users_path(:type => :special)