【问题标题】:How to have different URL for each Model instance in rails app如何在 Rails 应用程序中为每个模型实例设置不同的 URL
【发布时间】:2018-09-17 09:25:18
【问题描述】:

我很好奇我们如何为每个模型实例创建不同的 URL。

例如

如果我有一个模型 School,它有许多关联模型,例如 部门、班级、学生等。 现在我想要的是,每当用户注册一所新学校时,它应该有自己的 URL。 [新的学校表格要求用户提供学校的 URL 和名称]

例如

www.school1.com/classes/1

www.school2.com/students/2

【问题讨论】:

  • 您可以为多个用户使用不同的子域,例如 school1.golbalschool.com,而不是单独的域
  • 我知道,但我想要的是使用不同的 URL 而不是子域!
  • 你知道吗,你必须为每所学校购买域名?你知道吗?
  • 当然.. ..

标签: ruby-on-rails ruby url routes


【解决方案1】:

自定义域会有点困难,因为您需要手动管理域和 DNS。但是,这是可能的。您将设置多个域,并将它们全部指向您的应用程序。然后,在您的控制器中,您将检查哪个学校与 request.host 匹配。

一个更简单的解决方案是为每个学校设置一个子域。这不需要自定义配置,本文对此进行了很好的概述:https://mythoughts.io/managing-dynamic-domains-with-rails-b6ab1040dc8c

我希望这有助于回答您的问题,


更新以提供具体实施细节:

在您的School 对象上,我将添加一个字符串类型的domain 属性。这应该验证其唯一性和存在性:

# Within School.rb:
validates :domain, presence: true, uniqueness: true

接下来,在您的 ApplicationController 中,实现 before_action 查找以根据请求 URL 查找学校。这将采用 school1.com 或 school2.com 的格式。请注意,如果未找到 School,使用 ! 将自动引发 404 错误。

before_action :find_school

private

def find_school
  @school = School.find_by_domain!(request.host)
end 

要在本地进行测试,您可以使用以下命令编辑主机文件:

sudo nano /etc/hosts

添加以下行:

127.0.0.1 school1.com
127.0.0.1 school2.com

然后,您可以使用 school1.com:3000 和 school2.com:3000 通过网络浏览器访问您的应用程序。 (您需要使用端口 3000,因为这是您的 Rails 应用程序默认使用的端口)。

【讨论】:

  • 我应该使用 resolv 吗?
  • 解决了什么?你能分享一个链接来澄清一下吗?
  • 啊,谢谢你的澄清。我将修改我的答案,以提供有关如何实现此功能的更多详细信息。
  • @nnd 如果这回答了您的问题,如果您将答案标记为正确,我将不胜感激!
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多