16

您好,我一直试图在 Rails 中获取当前环境,但我认为我的 javascript 做错了,但我似乎不知道是什么。在我的 application.js 我有...

var rails_env = '<%= Rails.env -%>';
alert(rails_env);
alert(rails_env.value);
if(rails_env == 'development'){
    alert('inside if')
    var indexName = "idx";
}
else{
    alert('inside else')
     var indexName = "idx_production";
}

即使我处于开发模式,它也总是进入我的 else 语句。我究竟做错了什么?谢谢你

如何在rails应用程序的javascript文件中获取环境

4

4 回答 4

45

您不需要直接将其传递到您的 javascript 文件中。您可以erb像这样在视图文件中执行此操作,例如:

<script>
  window._rails_env = "<%= Rails.env %>"
</script>

或者更好的是:

<%= javascript_tag do %>
  window._rails_env = "<%= Rails.env %>"
<% end %>

或最好的(恕我直言)这个:

<body data-env="<%= Rails.env %>">
  ...

进而:

var railsEnv = $('body').data('env')

警告:

像这样在脚本中转储整个 Rails 环境几乎肯定会危及 Web 应用程序的安全性!正如 Michał Zalewski 在下面的评论中提到的,您的 Rails 应用程序在其环境中具有敏感信息,例如数据库凭据、API 密钥、用于签名和加密 cookie 的应用程序机密等。

于 2012-05-04T08:17:24.877 回答
15

Rails 的资产管道只会预处理您标记为解析的资产。无论这些资产最终会是 CSS、JS 还是其他任何东西,您都可以通过调整文件扩展名来标记要解析的文件。

在这种情况下,当您尝试输出 ERB 变量时,您需要将文件的扩展名更改为application.js.erb.

这里有预处理器的扩展讨论。

于 2012-05-04T00:35:35.770 回答
2

对我来说,environment.js位于/config/webpack/environment.js

于 2020-09-26T12:52:02.947 回答
0

如果您在 Rails 应用程序中使用 Webpack,则有一个更简单的解决方案。

TLDR:使用process.env.RAILS_ENVprocess.env.NODE_ENV

在您的 webpack 编译的 javascript 文件之一中:

console.log('Rails env: ', process.env.RAILS_ENV);
console.log('Node env: ', process.env.NODE_ENV);

您可以复制粘贴的完整解决方案如下。process.env 的文档

正如u/matthew 的回答所指出的,在 erb 文件中使用 Rails.env 存在风险。同样,如果NODE_ENV没有在您的生产服务器上正确配置,您可能会遇到意外或危险的行为。我建议实现一个小模块来检查这两个变量,如果它们不匹配则抛出错误。

完整的解决方案

  • 实现一个检查两种环境的小模块
  • 在需要的地方导入这个模块

javascript/environment/index.js

/* global process */

const railsEnv = process.env.RAILS_ENV;
const nodeEnv = process.env.NODE_ENV;

if (!railsEnv || railsEnv !== nodeEnv) {
  const errorMsg = `RAILS_ENV (${railsEnv}) does not match NODE_ENV (${nodeEnv})`;
  throw new Error(errorMsg);
}

export default railsEnv;

现在可以在任何你喜欢的地方使用,比如在 React 组件中。

javascript/components/MyComponent

import env from '../../environment';

class PaintTheKeyboard extends React.Component {
  constructor(props) {
    super(props);
    console.log(env);
  }
  ...
  render() { ... }
}
于 2022-01-29T13:45:24.363 回答