【发布时间】:2019-06-26 13:23:39
【问题描述】:
我有一个 Rails 应用程序视图,我想根据 ENV 变量设置显示两个部分之一。出于某种原因,条件总是被评估为 false,因此会显示 campaign_active 部分。我已将 ENV 更改为 true 并尝试切换渲染语句,发现只有 else 之后的语句被执行。我错过了什么?
这是视图:
<% if Rails.application.config.ended %>
<%= render "users/campaign_ended" %>
<% else %>
<%= render "users/campaign_active" %>
<% end %>
这是application.rb 设置:
config.ended = ENV['CAMPAIGN_ENDED'].to_s == 'true'
这是.ENV 文件:
CAMPAIGN_ENDED=true
ENV 中的活动设置设置为 true,因此我希望我认为条件为 true 并呈现活动结束部分。但相反,它呈现了活动部分。现在,如果我切换语句并将campaign active 放在活动结束之前,那么campaign ended 会部分呈现。
【问题讨论】:
-
你有没有检查过代码中
ENV['CAMPAIGN_ENDED']在那个时间点实际返回的内容?你如何处理在你的代码中读取.ENV,你是使用gem还是自己写的东西? -
是的,我正在使用分组在开发和测试下的 dotenv-rails gem。我的 ENV 文件中的所有其他设置都工作正常。我应该补充一点,我正在使用 Suspenders 模板 (github.com/thoughtbot/suspenders) 如何检查
ENV['CAMPAIGN_ENDED']返回的内容? -
dotenv-rails gem 期望文件名是小写的 (
.env)。您能否重命名您的文件并再次检查?您是否包含了将 env 文件加载到config/application.rb中所需的代码?在Dotenv::Railtie.load电话之后是您的config.ended =代码吗?要检查ENV['CAMPAIGN_ENDED']的值,您只需将其值记录到 Rails 日志并搜索该条目:Rails.logger.debug("ENV['CAMPAIGN_ENDED'] => #{ENV['CAMPAIGN_ENDED'].inspect}")它会在重新启动服务器后提前显示。 -
非常感谢。我错过了加载 env 文件所需的
Dotenv::Railtie.load代码。我认为它会在模板配置期间全部设置,因为当我第一次运行服务器时,一切正常,就好像所有 env 配置都加载正常一样。以防万一其他人将来遇到此问题,您需要在修改 .ENV 文件后重置服务器,否则您将看不到结果。再次感谢@spickermann -
使用环境变量来改变运行时行为是相当严厉的。您需要重新启动 Rails 进程才能使更改生效。通常最好有一个截止日期,您可以在其中从一个切换到另一个,例如
if (Campaign.ended?),这是一个实现逻辑的模块。
标签: ruby if-statement ruby-on-rails-5