0

在我的“routes.rb”文件中,我有以下行:

resource :users

这给了我一堆命名路由,用于以 RESTful 方式访问我的用户模型。

现在,我对 User 模型做了一些补充,包括创建一个特殊的用户类。这些仍然存储在用户模型中,但数据库中有一个“特殊”标志将它们标识为特殊。

那么,是否可以创建 special_users 资源?例如,我希望将“special_users_path”作为“/special_users”的命名路由,当您在 URL 上执行 GET 时,它将仅返回特殊用户的索引。

有没有办法做到这一点?

4

2 回答 2

0

在 Rails 路由中,“资源”指的是为 RESTful 资源创建的标准 7 条路由:indexshownewcreateedit和。通常这就足够了,但有时您可能想要创建另一个动作。updatedestroy

在模型中,您要创建一个scope只返回特殊用户的:

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

在控制器方面,有两种方法可以解决这个问题。您的建议是创建一个附加操作:

match "/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,请告诉我)

于 2010-11-12T00:48:36.577 回答
0

您可以将 special_users 设置为资源:

resource :special_users

如果你需要将它指向一个特殊的控制器,你可以指定它:

resource :special_users, :controller => :users

但我真的建议您不要创建另一个控制器来检索一种用户,而是使用参数来获取它们:

 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)
于 2010-11-12T00:52:41.633 回答