16

こんにちはiveは現在の環境を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 %>

または最高の(IMHO)これ:

<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 に答える
0

Rails アプリで Webpack を使用している場合は、もっと簡単な解決策があります。

TLDR: またはのいずれprocess.env.RAILS_ENVかを使用process.env.NODE_ENV

webpack でコンパイルされた JavaScript ファイルの 1 つで:

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

コピーして貼り付けることができる完全なソリューションは以下のとおりです。process.env のドキュメント

u/matthew's answerで指摘されているように、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 に答える