从StimulusJS控制器访问Rails环境变量的方法

145 阅读2分钟

环境变量是配置你的Rails应用程序的一个好方法。你可以使用Rails.env 变量来有条件地改变你在开发/测试或生产时的行为。你还可以为API令牌或全局设置等事项添加你自己的应用程序特定变量。

虽然Stimulus有一个values API来读取HTML数据属性,但有时你需要的数据并不是每次创建控制器时都要传入的。

一个替代方法是在渲染你的视图时使用<meta> 标签。然后,在你的Stimulus Javascript代码中,你可以查询<meta> DOM元素来检索值。

使用方法

首先,将<meta> 标签添加到你的应用程序模板中的<head> 部分。在这个例子中,假设我们想知道Rails.env ,因为我们想在测试模式下运行应用程序时改变一个设置(我最近不得不这样做,以改变一个第三方库中的设置,以配合无头系统测试)。

你可以使用Rails的tag 帮助器来避免一堆字符串插值。

# Inside the <head> tag of your application layout

<%= tag :meta, name: :rails_env, content: Rails.env %>

这将呈现一个<meta> 标签,如。

<meta name="rails_env" content="development">

接下来,在你的Stimulus控制器中,查询该标签并读取其内容。

import { Controller } from '@hotwired/stimulus'

export default class extends Controller {
  connect() {
    if (this.isTestEnvironment) {
      // Do something for testing
    } else {
      // Do something for dev/prod
    }
  }

  get isTestEnvironment() {
    return document.head.querySelector("meta[name=rails_env]").content === "test"
  }
}

如果你愿意,你也可以将其提取到一个帮助器中--这里有一个来自Railsrequest.js 库的实用函数,它在发送Javascript请求时使用这个相同的<meta> 标签模式来访问Rails的CSRF令牌。

function metaContent (name) {
  const element = document.head.querySelector(`meta[name="${name}"]`)
  return element && element.content
}

请记住,这些数据在你的页面源中是可见的!与只存在于服务器上的环境变量不同,把数据放到你的HTML中会让终端用户可以访问它。请确保你只公开那些安全的数据。