【问题标题】:Ruby on Rails if/else condition not workingRuby on Rails if/else 条件不起作用
【发布时间】: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'] =&gt; #{ENV['CAMPAIGN_ENDED'].inspect}") 它会在重新启动服务器后提前显示。
  • 非常感谢。我错过了加载 env 文件所需的 Dotenv::Railtie.load 代码。我认为它会在模板配置期间全部设置,因为当我第一次运行服务器时,一切正常,就好像所有 env 配置都加载正常一样。以防万一其他人将来遇到此问题,您需要在修改 .ENV 文件后重置服务器,否则您将看不到结果。再次感谢@spickermann
  • 使用环境变量来改变运行时行为是相当严厉的。您需要重新启动 Rails 进程才能使更改生效。通常最好有一个截止日期,您可以在其中从一个切换到另一个,例如if (Campaign.ended?),这是一个实现逻辑的模块。

标签: ruby if-statement ruby-on-rails-5


【解决方案1】:

请仔细检查您是否将.env 文件加载到config/application.rb

Dotenv::Railtie.load

在你实际使用这一行中的环境变量之前

config.ended = ENV['CAMPAIGN_ENDED'].to_s == 'true'

请记住,更改.env 文件后需要重新启动Rails 应用程序。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2018-10-16
    • 2015-11-08
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多