如何存储值,以便在Ruby on Rails中的整个请求之间共享该值?


如何

存储一个值,以便它在整个请求中共享(即使其在控制器、视图和模型中可访问)?

  1. 放置作为全局变量
  2. 创建一个单一实例并将其存储在类变量中
  3. 将其存储在本地线程中。

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)

最新更新