Ruby 浏览器间共享的Sinatra会话数据
我有一个使用Sinatra运行的基本银行应用程序 我已尝试实施会话,以确保访问的每个用户都有不同版本的应用程序。然而,目前,如果我使用两个不同的浏览器访问它,我拥有相同的数据 没有实现后端数据库,但我通过界面添加的数据会在我访问的每个浏览器中保持不变 这是我的Ruby 浏览器间共享的Sinatra会话数据,ruby,session,heroku,sinatra,Ruby,Session,Heroku,Sinatra,我有一个使用Sinatra运行的基本银行应用程序 我已尝试实施会话,以确保访问的每个用户都有不同版本的应用程序。然而,目前,如果我使用两个不同的浏览器访问它,我拥有相同的数据 没有实现后端数据库,但我通过界面添加的数据会在我访问的每个浏览器中保持不变 这是我的app.rb: require 'sinatra/base' require 'tilt/erb' require 'require_all' require_all 'lib' require 'rufus-scheduler' cla
app.rb
:
require 'sinatra/base'
require 'tilt/erb'
require 'require_all'
require_all 'lib'
require 'rufus-scheduler'
class BankingApp < Sinatra::Base
enable :sessions
set :session_secret, 'super secret'
get '/' do
session[:accounts] = AccountsController.instance
session[:holders] = HoldersController.instance
session[:loans] = LoansController.instance
erb :index
end
get '/holders' do
@holders = session[:holders].store
erb :holders
end
get '/holders_accounts' do
@holder = session[:holders].find(params[:id].to_i)
message = session[:accounts].get_accounts_of(params[:id].to_i)
@accounts = message.accounts
erb :holders_accounts
end
get '/new_holder' do
erb :new_holder
end
post '/new_holder' do
@message = session[:holders].create(params[:name])
@holders = session[:holders].store
erb :holders
end
get '/create_account' do
erb :create_account
end
post '/create_account' do
type = :Current
id = params[:id].to_i
@message = session[:accounts].open(type, with: id)
erb :index
end
get '/accounts' do
@accounts = session[:accounts].store
erb :accounts
end
get '/transactions' do
message = session[:accounts].get_transactions_of(params[:id].to_i)
@transactions = message.transactions
erb :transactions
end
get '/deposit' do
erb :deposit
end
post '/deposit' do
@accounts = session[:accounts].store
@message = session[:accounts].deposit(params[:amount].to_i, into: params[:id].to_i)
erb :accounts
end
get '/withdraw' do
erb :withdraw
end
post '/withdraw' do
@accounts = session[:accounts].store
@message = session[:accounts].withdraw(params[:amount].to_i, from: params[:id].to_i)
erb :accounts
end
get '/transfer' do
erb :transfer
end
post '/transfer' do
@accounts = session[:accounts].store
@message = session[:accounts].transfer(params[:amount].to_i, from: params[:donar].to_i, to: params[:recipitent].to_i)
erb :accounts
end
get '/add_holder' do
erb :add_holder
end
post '/add_holder' do
@accounts = session[:accounts].store
@message = session[:accounts].add_holder(params[:holder_id].to_i, to: params[:account_id].to_i)
erb :accounts
end
get '/enable_overdraft' do
erb :enable_overdraft
end
post '/enable_overdraft' do
@accounts = session[:accounts].store
@message = session[:accounts].activate_overdraft(params[:id].to_i, params[:amount].to_i)
erb :accounts
end
get '/disable_overdraft' do
erb :disable_overdraft
end
post '/disable_overdraft' do
@accounts = session[:accounts].store
@message = session[:accounts].deactivate_overdraft(params[:id].to_i)
erb :accounts
end
get '/loans' do
@loans = session[:loans].store
erb :loans
end
get '/loan_view' do
message = session[:loans].show(params[:id].to_i)
@transactions = message.transactions
erb :loan_view
end
get '/new_loan' do
erb :new_loan
end
post '/new_loan' do
@loans = session[:loans].store
id = params[:id].to_i
options = { borrowed: params[:amount].to_i, term: params[:term].to_i, rate: params[:rate].to_f }
@message = session[:loans].create_loan(id, options)
erb :loans
end
get '/pay_loan' do
erb :pay_loan
end
post '/pay_loan' do
@message = session[:loans].pay(params[:amount].to_i, off: params[:id].to_i)
@loans = session[:loans].store
erb :loans
end
# start the server if ruby file executed directly
run! if app_file == $0
end
需要'sinatra/base'
需要“倾斜/再倾斜”
require“require\u all”
需要所有“lib”
需要“rufus调度程序”
类BankingApp
我对西纳特拉没有太多的经验,所以如果这是我的疏忽,我深表歉意
非常感谢您的帮助。我建议您使用此工具 获取“/注销”操作 会话。清除 结束
所以我很确定你的问题的核心是在你的代码中的多个地方。按照 这确保了只能创建一个Klass实例 您已经明确告诉ruby,每个类/模块只允许存在一个副本。我认为那不是你想要的
很难准确地推断出您想要实现的目标,但我认为在web应用程序中使用
Singleton
不是正确的解决方案。当你运行应用程序的第二个实例(或者用Heroku的话说是dyno)时,它强加的假设就会崩溃 你是否能够分享更多关于你在这里想要达到的目标,以及你为什么要采用这种方法。这里有很多东西不是Sinatra或Ruby的惯用语言,再加上我们看不到的所有代码(例如控制器的定义),很难有信心地说什么是坏的,什么只是以非标准方式实现的。编辑:刚刚注意到代码在GitHub上,我将在那里浏览:)谢谢您的回复。我使用了单例类,这样我就可以在每个控制器中引用每个控制器的单个实例。让控制器彼此通信。有更有效的方法吗?@robertpulson来自“对于每个传入的请求,都会创建一个新的应用程序类实例”。要共享数据,请使用或使用类实例变量。