我有一个Rails应用,如果用户已登录,我想保存div的状态。
示例:有人登录并单击div将其隐藏。我希望将其存储在某个地方,因此,如果他再次打开页面,该div仍将被隐藏。
我不想使用本地存储,因为我也希望在移动设备或其他计算机/浏览器上保存状态。根据用户的不同,它在每个地方都必须相同。
我当时正在考虑在用户模型中将每个div的每个状态存储为布尔值,但是这个想法听起来一点也不干净,如果这样做,我想我晚上也无法入睡>
有什么主意吗? 我认为React / Redux可以轻松解决这个问题(也许不是,它也只是本地的?),但此刻我仍受Rails的困扰。
非常感谢!
答案 0 :(得分:2)
React / Redux不能拯救您,因为除了一些方便的绑定之外,没有什么神奇的事情发生。在窗帘后面,他们使用相同的“浏览器功能”。
恐怕您需要为您找到最佳的折衷方案。我会发表一些想法:
由于您对此进行了调查,因此在这里可能无需多说。
从Chrome 25开始,他们授予了storage.sync的访问权限,您可以以此开发系统。始终尝试检索数据(如果有),然后记住保留新数据并进行同步。也许其他浏览器也支持此功能,但缺点是您还必须拥有这些代码。
您可以使用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