如何在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_method
和 config.action_mailer.default_url_options
和 config.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 的本地开发服务器,以便可以从其他主机访问它(考虑到你的安全环境)
与控制器不同,邮件程序实例没有任何关于传入请求的上下文,因此您需要自己提供 :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
) 都是基于请求。
我正在开发一个已将其默认主机设置为 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_method
和 config.action_mailer.default_url_options
和 config.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 的本地开发服务器,以便可以从其他主机访问它(考虑到你的安全环境)
与控制器不同,邮件程序实例没有任何关于传入请求的上下文,因此您需要自己提供 :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
) 都是基于请求。