使用Rails保持前端状态

时间:2019-11-25 13:21:18

标签: javascript ruby-on-rails ruby local-storage

我有一个Rails应用,如果用户已登录,我想保存div的状态。

示例:有人登录并单击div将其隐藏。我希望将其存储在某个地方,因此,如果他再次打开页面,该div仍将被隐藏。

我不想使用本地存储,因为我也希望在移动设备或其他计算机/浏览器上保存状态。根据用户的不同,它在每个地方都必须相同。

我当时正在考虑在用户模型中将每个div的每个状态存储为布尔值,但是这个想法听起来一点也不干净,如果这样做,我想我晚上也无法入睡

有什么主意吗? 我认为React / Redux可以轻松解决这个问题(也许不是,它也只是本地的?),但此刻我仍受Rails的困扰。

非常感谢!

2 个答案:

答案 0 :(得分:2)

React / Redux不能拯救您,因为除了一些方便的绑定之外,没有什么神奇的事情发生。在窗帘后面,他们使用相同的“浏览器功能”。

恐怕您需要为您找到最佳的折衷方案。我会发表一些想法:

粘贴到localStorage

由于您对此进行了调查,因此在这里可能无需多说。

绑定到Chrome

从Chrome 25开始,他们授予了storage.sync的访问权限,您可以以此开发系统。始终尝试检索数据(如果有),然后记住保留新数据并进行同步。也许其他浏览器也支持此功能,但缺点是您还必须拥有这些代码。

使用webRTC进行的实验

您可以使用webRTC在两个浏览器之间传输数据。尽管我对此没有很多经验,但我不推荐这样做,但这绝对是您要考虑的一种方法。

也许检查以下项目:https://github.com/cjb/serverless-webrtc

创建自己的存储空间

选择一个存储(我认为甚至firebase / dynamodb都可以使用)并构建一个系统来保存用户首选项。如果您拥有Auth0,则可以在其中保留一些逻辑,并且由于它们提供了SSO,因此检查这些自定义项将非常容易。

请记住,由于您不想使用localStorage,因此需要保留会话并将此首选项保存在user_id或其他名称下。

我认为,对此没有最佳解决方案,只有为了支持此目的而要交易的东西。如果您不介意保留整个业务逻辑,那么我不明白为什么为此创建存储会使其变得太慢。测量负载并一路优化。

答案 1 :(得分:1)

听起来这是用户首选项类型的配置。这样,您可以将设置存储为用户模式中的单个字段。为此,您可以使用可序列化的哈希或json类型。

所以假设您有一个app/models/user.rb

添加运行迁移

rails g migration add_view_options_to_users view_options:text
rake db:migrate

将此添加到模型中

class User < ActiveRecord::Base
  serialize :view_options, Hash
end

然后在您的用户控制器中,您可以发布到更新操作,以便向permitted_params添加一个字段

private

def permitted_params
  params.require(:user).permit(:view_options, #other options etc.)
end

如果需要,您需要在此处编写一些JavaScript,以将view_options发布到用户/更新或自定义路由。但是基本上每个字段的值都将保存在控制器动作中,例如:

def update
  @user = User.find(params[:id])
  opts = @user.view_options || {}
  user.view_options = opts.merge(params[:view_options])
  if @user.save
    render json: { status: true, user_id: @user.id }
  else
    render json: { status: false, errors: @user.errors.full_messages }
  end
end