gpt4 book ai didi

ruby-on-rails - 让 Devise 在注册时创建一个子域

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:26 26 4
gpt4 key购买 nike

我想让 Devise 在我的网站上创建子域。

现在,我有两个模型:

  1. 公司:公司可以直接在网站上注册,登录后可以邀请其员工。公司注册时,我希望创建一个唯一的子域(例如 example.com => techcraz.example.com。)

  2. 员工:员工只有在收到邀请链接后才能注册。

我想要什么:

  • 作为注册页面的主域。
  • 公司员工 的单一登录页面。
  • 登录时,他们必须提供域名,然后他们应该被重定向到该子域的登录页面(例如 techcraz.example.com/signin。)
  • 当输入一个不存在的 URL 时,他们应该被重定向到注册页面。

我是 Rails 新手。请帮忙!

提前致谢!

最佳答案

每个用户一个子域是 Web 应用程序开发中相当常见的用例。方法如下:

首先:确保您的 Users 表 有一个 :name 列(我认为 Devise 默认会这样做 - 如果没有,您可以运行 rails g migration AddNameToUsers name :string 将此列添加到您的数据库中)。

要将此 User.name 用作子域,我们需要确保它只包含字母数字字符(带有可选的下划线)。我们还将名称限制为最多 32 个字符。最后,我们不希望用户选择诸如“www”之类的名称会导致诸如“http://www.myapp.com”之类的 URL。 ”。以下是 app/models/user.rb 的验证:

validates_format_of :name, with: /^[a-z0-9_]+$/, 
message: "must be lowercase alphanumerics only"

validates_length_of :name, maximum: 32,
message: "exceeds maximum of 32 characters"

validates_exclusion_of :name, in: ['www', 'mail', 'ftp'],
message: "is not available"

可选:修改您的 db/seeds.rb(以便在您初始化数据库时创建测试用户):

user = User.create! :name => 'myname', :email => 'user@example.com', 
:password => 'password', :password_confirmation => 'password'

当任何人输入包含与现有用户匹配的子域的 URL app/controllers/profiles_controller.rb 时,我们将显示用户的个人资料页面:

class ProfilesController < ApplicationController
def show
@user = User.where(:name => request.subdomain).first || not_found
end

def not_found
raise ActionController::RoutingError.new('User Not Found')
end
end

下面是 View app/views/profiles/show.html.erb 的示例文件:

<h1>Profile</h1>
<h3><%= @user.name %></h3>
<h3><%= @user.email %></h3>

最后,我们需要为子域实现路由。像这样创建一个类:

class Subdomain
def self.matches?(request)
case request.subdomain
when 'www', '', nil
false
else
true
end
end
end

确保在应用程序启动时自动加载此类config/application.rb:

config.autoload_paths += %W(#{config.root}/lib)

确保您的 routes.rb 文件包含以下路线:

devise_for :users
resources :users, :only => :show
constraints(Subdomain) do
match '/' => 'profiles#show'
end

如果您为配置文件 Controller 使用了 rails generate - 确保删除 get "profiles/show" 路由。

See this page有关在您的应用程序中使用 URL Helpers 的信息(基本上您需要使用 new_user_session_url 而不是 new_user_session_path 并且您可以像这样指定一个子域:

root_url(:subdomain => @subdomain)

关于ruby-on-rails - 让 Devise 在注册时创建一个子域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28735786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com