3

我正在使用 Rails 构建一个 Web 应用程序,它为每个企业提供自己的帐户和子域,类似于 basecamp(和其他 37 个信号应用程序)lighthouseapp.com 等。

现在我知道有很多关于如何在 Rails 中创建子域的不错的教程,甚至还有 subdomain-fu 插件。

问题是我想使用用户的电子邮件地址作为他们的登录名,这意味着它必须是唯一的,但是我只希望它对每个帐户而不是所有帐户都是唯一的。

我正在使用设计进行身份验证,并且我创建了一个代表帐户的“帐户”模型,以及一个代表该帐户用户的用户模型。Devise 在用户模型上运行,看起来它要求每个用户都有一个唯一的电子邮件地址。

我是否已经足够清楚地说明了这个问题?我很乐意提供澄清。

谁能指出我正确的方向?


为蒂姆澄清一些细节

  • 问:个人企业可以拥有多少个账户?
  • 答:每个企业都有一个帐户。比如“Springfield Maths”

  • 问:子域和账户之间是否存在一一对应关系?

  • 答:可以,例如 springfield-maths-grinds.myapp.com

  • 问:“用户”是指自然人,还是账户中的角色?

  • 答:我应该更好地解释这一点。我实际上有两个独立的模型,例如导师和学生。每个帐户将有多个导师和学生。

企业、帐户、子域 企业和帐户实际上是一回事。可以说是“商业帐户”。我正在使用子域来访问每个“企业帐户”

登录名、用户、电子邮件地址 我应该澄清一下,我有两种类型的用户,它们由不同的模型表示,它们是导师和学生。这些将需要登录到应用程序,我想使用电子邮件地址作为他们的登录名,而不是用户名。

希望这能解决问题,而不是让事情变得更糟。

我的实际问题如下,如果有人要为“Springfield 物理研究”设置一个商业帐户,并且“Springfield 数学研究”的一名学生尝试注册,那么他们将无法注册,因为电子邮件地址已经在使用并且需要是唯一的。我想知道如何在企业帐户中确定学生和导师的范围。

4

2 回答 2

1

你需要考虑两件事。数据完整性和身份验证。

Rails 允许您将唯一性范围限定为一列或多列。通过范围界定,您可以在数据库中拥有多个 foo@bar.local 电子邮件地址,但每个帐户只有一个。我已经包含了相应的 SQL 可能看起来像这样以演示它是如何工作的。

# Without scoping
validates :email, :uniqueness => true
SELECT 1 FROM `users` WHERE `users`.email = 'foo@bar.local'

# With scoping
validates :email, :uniqueness => true, :scope => :account_id
SELECT 1 FROM `users` WHERE `users`.account_id = 1 AND `users`.email = 'foo@bar.local'

我假设您使用的是 Rails 3。validates_uniqueness_of如果您使用的是 Rails 2,则可以传递相同的选项。

对于身份验证,您需要找到帐户,确保用户属于该帐户并检查他们的密码是否匹配。当您向用户展示登录表单时,您已经知道他们的身份验证针对的是哪个帐户。您的操作可能如下所示。

def create
  @account = Account.find_by_subdomain(params[:subdomain])
  @user    = @account.users.find_by_email(params[:user][:email])
  if @user.authenticate(params[:user][:password])
    redirect_to dashboard_path
  else
    render :new
  end
end
于 2010-10-23T13:13:47.817 回答
0

我认为你需要更清楚你在做什么以及你在问什么。重要的是首先解释您的需求和数据模型,而不是您使用的包。在您的问题中,我们有:

  • 企业
  • 帐户
  • 子域
  • 登录
  • 用户
  • 电子邮件地址

我猜其中一些是相同的东西。所以也许你可以从概述这些东西如何组合在一起开始。这里有一些问题:

  • 个人企业可以拥有多少个账户?
  • 子域和帐户之间是否存在一对一的关联?
  • “用户”是对应于自然人还是帐户中的角色?

一旦你清楚这些事情是如何组合在一起的,并且你可以清楚地说明这一点,你的问题就会更容易回答。

于 2010-10-23T13:08:24.220 回答