【问题标题】:Detect base url in controller? [closed]在控制器中检测基本网址? [关闭]
【发布时间】:2020-10-12 17:39:59
【问题描述】:

我们如何检测控制器中的根/基本 url?

我正在运行一个函数,它需要知道在完成后将用户返回到哪里,我希望它在开发和生产中工作。目前,如果我只是使用域名,那么在开发中它会将用户返回到实际网站(即www.example.com/reauth,而不是 http://localhost:3000),这是不可取的(在开发中,用户应该返回给开发人员;他们不应链接到网站的 prod 版本)。

所以我想要返回的代码:

  • https://www.example.com 在生产中和
  • http://localhost:3000 正在开发中

示例

这是我需要将refresh_url 的值设置为的确切示例的简化版本:

  • https://www.example.com/reauth 在生产中,
  • localhost:3000/reauth 正在开发中

注意这里的关键是url的后半部分是一样的,但是前半部分(base url)是生产中的实际域,和开发中的localhost。

Stripe::AccountLink.create({
    refresh_url: 'https://www.example.com/reauth'
  })

到目前为止我所知道的

我看过:

【问题讨论】:

  • 我已经尽可能地简化了这一点,同时提供了尽可能多的细节以使问题完全可以理解。我希望它可以重新打开
  • 考虑查看root url 或使用命名助手查看新路由。除非 example.com 不是您的服务器,否则您不需要使用 .base_url

标签: ruby-on-rails ruby-on-rails-6


【解决方案1】:

我发现method here 有效。

request.base_url

注意事项:

  • 这将返回不带正斜杠的 url。
  • 这在 Rails 控制台中不起作用

为了将来参考,以下是我解决的问题,可以根据应用是在 dev 还是 prod 中运行来提供正确的基本 url:

base_url = (!Rails.const_defined? 'Console') ? (request.base_url) : "http://localhost:3000"

【讨论】:

  • 它在控制台中不起作用,因为请求对象仅在控制器中可用。
  • @MibraDev 感谢您让我知道。那是因为请求对象是在应用程序启动时生成的还是出于其他原因?是否有一种合理的模式来测试 Rails 控制台中不存在的对象(r​​ails 控制台是我测试代码的“去处”,所以这个问题比它应该解决的时间更长,因为我无法得到request.base_url在控制台中工作)。非常感谢任何建议
  • @stevec 请求对象是当前 HTTP 请求的表示。控制台中没有当前的 HTTP 请求。您只会在控制器操作的上下文中使用一个(或路由器、中间件类,也许还有其他一些罕见的情况)。您可以使用 byebug 之类的调试器在一些控制器代码中间获取交互式控制台环境,然后在那里进行测试。
猜你喜欢
  • 2013-05-18
  • 2017-11-10
  • 2016-11-07
  • 2012-08-20
  • 1970-01-01
  • 2016-10-07
  • 2012-04-19
  • 2017-07-30
  • 1970-01-01
相关资源
最近更新 更多