存储一个值,以便它在整个请求中共享(即使其在控制器、视图和模型中可访问)?
- 放置作为全局变量
- 创建一个单一实例并将其存储在类变量中
- 将其存储在本地线程中。
在controller#action
中初始化的任何实例变量都将在视图中可用。若要在模型中使用这些变量,可以将它们作为参数传递给模型方法。
可能你可以像这样session[:foo] = @foo
在会话中存储值,并且你应该有能力获得这个值,无论你想要什么
在启动时设置的变量,其值不应更改。所有用户和所有线程共享且相同:使用常量。
在运行时设置的值可以更改的变量。对所有用户和所有线程共享且相同:使用类实例变量。
用户和线程的变量"private",但可在所有 rails 组件中访问:使用 Thread 变量。
初始值设定项中创建自定义配置变量,创建一个文件说global_var.rb inside your config/initializers
在此文件中声明任何变量并为其赋值,例如
custom_var ="你好世界!
现在要使用它,你必须做
Rails.configuration.custom_var = custom_var ,所以你的global_var.rb 应该包括
custom_var = "Hello World!"
Rails.configuration.custom_var = custom_var
现在您有Rails.configuration.custom_var
可以输出Hello World
,您可以在任何地方使用它。
但是,每当您启动应用程序/Rails服务器时,都会初始化它。
我认为拥有此功能的唯一方法是具有会话(或类似会话)的存储机制。
拥有会话存储将使数据在所有控制器和视图中可用,并且您可以将数据作为参数传递给模型。
如果您不想在会话中包含此类数据,则可以在会话中存储散列 uid,并在其他存储(例如 redis)中进行查找。 例如:
uid = session[:uid]
data_1 = Redis.handler_get_data_1_by_id(uid)
这将为您提供:
- 灵活性(您可以向用户添加额外的数据或任何标识符)
- 安全性(您的数据仅在您的系统上,并且通过hashed_id不同的会话无法访问彼此的数据)
- 性能(因为 Redis 的性能类似于 Memcache)