如何在Rails开发环境中用host生成URL?

How to generate URL with host in Rails development environment?

我正在开发一个已将其默认主机设置为 localhost:

的应用程序
config.action_controller.default_url_options = { host: "localhost" }
config.action_mailer.default_url_options = { host: "localhost" }

如果您在特定端口(例如 http://localhost:3000). I am using Pow so that I can access the app from a URL like http://myapp.dev

我如何更改此设置,以便它适用于我的域以及使用 localhost 的其他开发人员?我需要生成完整的 URL,因为它们将在电子邮件中使用。是否可以将某种配置值传递给 Pow?

这是我找到的最好的方法:

1- 创建一个 config/smtp_settings.example.yml 文件:

development:
  :method: :letter_opener
  :url_options:
    :host: localhost
    :port: 3000

production: &production
  :method: :smtp
  :url_options:
    :host: www.the_site.com
  :smtp_settings:
    address: smtp.gateway.com
    port: 465
    user_name: someone@somewhere.com
    # etc ...

staging:
  <<: *production

test:
  :method: :test
  :url_options:
    :host: test.host

备注:

  • 这里使用letter_opener作为开发邮件,改成你自己的方法
  • 有一个 staging 环境定义为 production 环境的精确副本,如果您不使用 staging
  • ,请删除

2- 从 config/environments/ 文件夹 [=21= 下的所有文件中删除 config.action_mailer.delivery_methodconfig.action_mailer.default_url_optionsconfig.action_mailer.smtp_settings ]

3- 在文件config/application.rb中添加以下内容:

config.action_mailer.delivery_method = config_for(:smtp_settings)[:method]
config.action_mailer.default_url_options = config_for(:smtp_settings)[:url_options]
config.action_mailer.smtp_settings = config_for(:smtp_settings)[:smtp_settings] if config_for(:smtp_settings)[:method] == :smtp

注意:config_for 已在最新版本的 Rails 中引入(4.2.0 根据写作)。如果您使用旧版本 rails,则必须手动加载 yml 文件


最重要的是回答你的问题:

将文件 config/smtp_settings.example.yml 推送到您的存储库并忽略文件 config/smtp_settings.yml。

您团队中的每个开发人员都必须通过复制文件 smtp_settings.example.yml 并更改 host 以匹配他们机器的文件来创建自己的 config/smtp_settings.yml IP地址,所以每个开发者发的邮件都指向自己的机器。

你当然需要启动绑定到 0.0.0.0 的本地开发服务器,以便可以从其他主机访问它(考虑到你的安全环境)

描述于Action Mailer Basics

与控制器不同,邮件程序实例没有任何关于传入请求的上下文,因此您需要自己提供 :host 参数。

由于 :host 通常在整个应用程序中是一致的,您可以在 config/application.rb:

中全局配置它

config.action_mailer.default_url_options = { host: 'example.com' }

由于这种行为,您不能在电子邮件中使用任何 *_path 助手。相反,您需要使用关联的 *_url 帮助器。例如,而不是使用

<%= link_to 'welcome', welcome_path %>

您将需要使用

<%= link_to 'welcome', welcome_url %>

Pow 的使用使事情变得有点棘手,但幸运的是它与 XIP.io 集成,因此您可以从本地网络上的机器访问 myapp.dev。只需按照此处的说明操作即可:Accessing Virtual Hosts from Other Computers.

这个问题没有提到这个,但它可能是有用的信息 - 如果你想在你的开发(或者可能 test/staging)环境中实际发送邮件,而不是只在rails 控制台(带有 powder applog 之类的东西),我建议只 hooking it up to a gmail

您需要在您的应用程序控制器中覆盖 default_url_options(至少在 rails 3 中)

http://edgeguides.rubyonrails.org/action_controller_overview.html#default_url_options

class ApplicationController < ActionController::Base
 def default_url_options
  if Rails.env.production?
   {:host => "myproduction.com"}
  else  
   {}
  end
 end

结束

在开发中,我喜欢用dotenv gem(https://github.com/bkeepers/dotenv).

我输入 .env :

DOMAIN=myapp.dev

我在里面放了config/route.rb MyApplication::Application.routes.draw do default_url_options host: ENV['DOMAIN']

在生产中,我使用以下命令在 heroku 上定义我的域:

h config:set DOMAIN=myapp.herokuapp.com

或使用自定义域:

h config:set DOMAIN=superdomain.com

这将检查应用程序根目录是否在当前用户的 .pow 中进行了符号链接,并相应地设置 host

if File.exists?(Dir.home+"/.pow/#{Rails.root.basename}")
  config.action_mailer.default_url_options = { host: "#{Rails.root.basename}.dev" }
else
  config.action_mailer.default_url_options = { host: "localhost" }
end

您可以使用环境变量来配置默认主机。请参阅 Luc Boissaye's 了解如何使用 dotenv 进行设置。如果您.env添加到您的存储库,每个开发人员都可以创建自己的.env并配置他(或她)自己的首选项。

但您也可以使用现有的环境变量来配置default_url_options。例如 Pow.cx 设置 POW_DOMAINS 变量:

config.action_mailer.default_url_options = {
  ENV['POW_DOMAINS'].present? ? 'my-app.dev' : 'localhost' 
}

据我所知,如果您想将其强制设置为默认值,则只需设置 config.action_controller.default_url_options。当您在视图中使用 rails _path 助手时,这将生成一个相对的 URL (/path)。如果你使用 _url 助手,这将生成一个绝对的 URL (http://your.host/path),但是协议 (http) 和主机 (your.host) 都是基于请求。