我使用rails构建一个网络应用程序,为每个企业提供自己的帐户和子域名,类似于basecamp(以及其他37个信号应用程序)lighthouseapp.com等等。
现在我知道有很多关于如何在rails中执行子域的教程,甚至是subdomain-fu插件。
问题是我想使用用户的电子邮件地址作为登录,这意味着它必须是唯一的,但我只希望它对每个帐户而不是所有帐户都是唯一的。
我正在使用设计进行身份验证,我创建了一个代表帐户的“帐户”模型,以及一个代表该帐户用户的用户模型。 Devise对用户模型进行操作,看起来它需要每个用户都有一个唯一的电子邮件地址。
我是否清楚地说明了这个问题?我很乐意提供澄清。
有人能指出我正确的方向吗?
答:每个企业都有一个帐户。例如“斯普林菲尔德数学研究”
问:子域和帐户之间是否存在一对一的关联?
答:可以,例如springfield-maths-grinds.myapp.com
问:“用户”是对应于自然人还是帐户中的角色?
商家,帐户,子域 商业&帐户实际上是一回事。可以说是“商业帐户”。 我使用子域名访问每个“商家帐户”
登录,用户,电子邮件地址 我应该澄清一下,我有两种类型的用户,由不同的模型代表,这些是导师和学生。这些将需要登录到应用程序,我想使用电子邮件地址作为他们的登录,而不是用户名。
希望能够解决问题,而不是让事情变得更糟。
我的实际问题如下, 如果有人要为“斯普林菲尔德物理研磨”设置一个商业帐户,并且其中一个“斯普林菲尔德数学研究”的学生试图注册,那么他们将无法这样做,因为电子邮件地址已经在使用并且需要独一无二。我想知道如何在商业帐户中确定学生和导师的范围。
答案 0 :(得分: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.如果您使用的是Rails 2,则可以将相同的选项传递给validates_uniqueness_of
。
对于身份验证,您需要找到该帐户,确保该用户属于该帐户并检查其密码是否匹配。当您向用户提供登录表单时,您已经知道他们对哪个帐户进行了身份验证。你的行动可能是这样的。
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
答案 1 :(得分:0)
我认为你需要对你正在做的事情以及你所要求的事情有所了解。重要的是解释您的需求和数据模型,而不是您正在使用的包。在你的问题中,我们有:
我猜其中一些是同样的事情。所以也许你可以先概括一下这些东西是如何组合在一起的。以下是一些问题:
一旦你清楚地意识到这些事情是如何结合在一起的,并且你可以清楚地说明这一点,那么你的问题将更容易回答。