Ruby on rails Rails 4应用程序中的子域

Ruby on rails Rails 4应用程序中的子域,ruby-on-rails,ruby-on-rails-4,devise,subdomain,Ruby On Rails,Ruby On Rails 4,Devise,Subdomain,今天我遇到了一个相当奇怪的现象。在开发一个Rails应用程序时,每个用户都有自己的子域,并试图使用Desive来实现这一点,我遇到了一个问题,即未注册的子域也会路由到根页面。因此,例如,即使没有(显式)子域,它也会将我路由到主应用程序页面。也许这与我的特殊设置有关?我还尝试了一个新的Rails项目,但得到了相同的结果。有人能帮我澄清一下吗?铁路诈骗者没有这样做 另外,现在我正在使用WEBrick,尽管这不是我将在生产中使用的,我正在使用域lvh.me来访问子域 谢谢你的帮助 编辑:这是我的rou

今天我遇到了一个相当奇怪的现象。在开发一个Rails应用程序时,每个用户都有自己的子域,并试图使用Desive来实现这一点,我遇到了一个问题,即未注册的子域也会路由到根页面。因此,例如,即使没有(显式)子域,它也会将我路由到主应用程序页面。也许这与我的特殊设置有关?我还尝试了一个新的Rails项目,但得到了相同的结果。有人能帮我澄清一下吗?铁路诈骗者没有这样做

另外,现在我正在使用WEBrick,尽管这不是我将在生产中使用的,我正在使用域lvh.me来访问子域

谢谢你的帮助

编辑:这是我的routes.rb文件:

Rails.application.routes.draw do
    devise_for :users
    root 'static_page#index'
end
我遵循了Desive wiki中的以下指南:

因此,我所做的是通过迁移删除了电子邮件的唯一性,接下来我添加了:subdomain to request_key,如下所示:

devise :database_authenticatable, :recoverable, :rememberable, :trackable, :timeoutable, request_keys: [:subdomain]
然后,我继续覆盖“find_for_authentication”函数,如下所示:

def self.find_for_authentication(conditions={})
    conditions[:account_id] = Account.find_by_subdomain(conditions.delete(:subdomain)).id
    super(conditions)
end
这就是总结

编辑:
我一直在胡闹,我发现了问题所在。“root”指令将所有子域引用到我的域。因此,如果我从routes.rb中删除根,每个子域都会导致RouteError。我记得我需要在我的应用程序中的某个地方为Desive添加根。因此,我不确定这是Devise的行为还是root的行为

您可能会遇到一些问题

首先,您需要了解Desive在用户登录后重定向用户的方式,其次是如何在Rails中路由子域

--

设计

默认情况下,(这通常意味着
用户#显示
)或路由中的某些内容:

def after_sign_in_path_for(resource)
  current_user_path
end
这意味着当您接受用户的登录时,他们将被带到自己的路径。根据您的路线,这通常意味着主站点(无子域)用户路径(
domain.com/users/56
)或其他内容

你的问题中没有任何细节,我只能对此进行推测

--

子域

刚刚完成了一些启用子域的应用程序,你应该考虑到子域的路由。

用户登录后,需要能够将其路由到特定的
子域
。执行此操作的方法是使用:

我们发现,使用常规路由路径无法做到这一点-您必须使用
url
(而不是
path
助手)。例如:

photos_path(subdomain: current_user.name) #-> does not work (path is relative)
photos_url(subdomain: current_user.name) #-> will route to http://name.lvh.me:3000
您必须记住的是,如果您希望将流量重定向/路由到不同的子域,则需要引用帮助程序的
url
表单,而不是
路径
引用

因此,如果您在
路径中使用后的,您将需要执行如下操作:

def after_sign_in_path_for(resource)
   root_url(subdomain: resource.name)
end
--

会话

最后,您希望确保您的Desive会话cookie在设置后仍保持初始化状态。我们发现默认情况下不会处理子域,因此您必须确保它们满足以下要求:


您可能有几个问题

首先,您需要了解Desive在用户登录后重定向用户的方式,其次是如何在Rails中路由子域

--

设计

默认情况下,(这通常意味着
用户#显示
)或路由中的某些内容:

def after_sign_in_path_for(resource)
  current_user_path
end
这意味着当您接受用户的登录时,他们将被带到自己的路径。根据您的路线,这通常意味着主站点(无子域)用户路径(
domain.com/users/56
)或其他内容

你的问题中没有任何细节,我只能对此进行推测

--

子域

刚刚完成了一些启用子域的应用程序,你应该考虑到子域的路由。

用户登录后,需要能够将其路由到特定的
子域
。执行此操作的方法是使用:

我们发现,使用常规路由路径无法做到这一点-您必须使用
url
(而不是
path
助手)。例如:

photos_path(subdomain: current_user.name) #-> does not work (path is relative)
photos_url(subdomain: current_user.name) #-> will route to http://name.lvh.me:3000
您必须记住的是,如果您希望将流量重定向/路由到不同的子域,则需要引用帮助程序的
url
表单,而不是
路径
引用

因此,如果您在
路径中使用后的,您将需要执行如下操作:

def after_sign_in_path_for(resource)
   root_url(subdomain: resource.name)
end
--

会话

最后,您希望确保您的Desive会话cookie在设置后仍保持初始化状态。我们发现默认情况下不会处理子域,因此您必须确保它们满足以下要求:


我手动解决了它。我发现routes.rb中的“root”指令接受来自每个子域的请求。最后,我实现了一个自定义约束,并将其添加到routes.rb文件中design_for的约束中。这充分解决了我的问题。谢谢大家的帮助

更新:

对于要求我提供代码的评论:我们建立了一个系统,每个帐户(业务帐户)都有自己的子域,每个业务帐户都有许多用户。我的子域约束看起来像

lib/subdomain.rb

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && Account.exists?(subdomain: request.subdomain)
  end
end
require 'Subdomain'

Rails.application.routes.draw do
  # Some routes...
  constraints(Subdomain) do
    devise_for :users, controllers: {:sessions => 'session'}
    root 'dashboard#index'
    # More subdomain constrained routes...
  end
end
然后在我的config/routes.rb中,我使用了约束来路由请求:

config/routes.rb

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && Account.exists?(subdomain: request.subdomain)
  end
end
require 'Subdomain'

Rails.application.routes.draw do
  # Some routes...
  constraints(Subdomain) do
    devise_for :users, controllers: {:sessions => 'session'}
    root 'dashboard#index'
    # More subdomain constrained routes...
  end
end

在我发布的原始问题中,我已经展示了其余的设置。我希望这对某人有所帮助。

我手动解决了它。我发现routes.rb中的“root”指令接受来自每个子域的请求。最后,我实现了一个自定义约束,并将其添加到routes.rb文件中design_for的约束中。这充分解决了我的问题。谢谢大家的帮助

<