环境变量是配置你的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中会让终端用户可以访问它。请确保你只公开那些安全的数据。