首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sinatra无法从帮助程序文件设置cookie

Sinatra无法从帮助程序文件设置cookie
EN

Stack Overflow用户
提问于 2020-05-23 22:25:10
回答 1查看 55关注 0票数 1

我的sinatra应用程序中有一个帮助文件,其中包含以下代码:

todo_sinatra_app/helpers/session_helper.rb

代码语言:javascript
复制
class SessionsHelper

  def self.sign_in(user)
    cookies[:remember_token] = { value: user.remember_token, expires: 20.years.from_now.utc }
    self.current_user = user
  end

...
end

当我试图从我的app.rb文件调用sign_in方法时,它抛出一个错误,它不知道如何创建cookies:

代码语言:javascript
复制
require 'sinatra'
require 'pg'
require 'sinatra/activerecord'
require 'sinatra/contrib'
require 'sinatra/cookies'
require './helpers/sessions_helper'
...

post '/sign_in' do
  user = User.find_by(email: params[:email])
  if user && user.authenticate(params[:password])
    SessionsHelper.sign_in(user)
    redirect '/'
  else
  ...
end

这是我的gemfile.lock

代码语言:javascript
复制
GEM
  remote: https://rubygems.org/
  specs:
    activemodel (5.2.0)
      activesupport (= 5.2.0)
    activerecord (5.2.0)
      activemodel (= 5.2.0)
      activesupport (= 5.2.0)
      arel (>= 9.0)
    activesupport (5.2.0)
      concurrent-ruby (~> 1.0, >= 1.0.2)
      i18n (>= 0.7, < 2)
      minitest (~> 5.1)
      tzinfo (~> 1.1)
    arel (9.0.0)
    backports (3.16.0)
    bcrypt (3.1.13)
    byebug (11.0.1)
    coderay (1.1.2)
    concurrent-ruby (1.1.5)
    daemons (1.3.1)
    diff-lcs (1.3)
    eventmachine (1.2.7)
    i18n (1.8.2)
      concurrent-ruby (~> 1.0)
    method_source (0.9.2)
    minitest (5.14.0)
    multi_json (1.14.1)
    mustermann (1.1.1)
      ruby2_keywords (~> 0.0.1)
    pg (1.2.2)
    pry (0.12.2)
      coderay (~> 1.1.0)
      method_source (~> 0.9.0)
    pry-byebug (3.7.0)
      byebug (~> 11.0)
      pry (~> 0.10)
    rack (2.1.2)
    rack-protection (2.0.8.1)
      rack
    rack-test (1.1.0)
      rack (>= 1.0, < 3)
    rake (13.0.1)
    rspec (3.9.0)
      rspec-core (~> 3.9.0)
      rspec-expectations (~> 3.9.0)
      rspec-mocks (~> 3.9.0)
    rspec-core (3.9.1)
      rspec-support (~> 3.9.1)
    rspec-expectations (3.9.0)
      diff-lcs (>= 1.2.0, < 2.0)
      rspec-support (~> 3.9.0)
    rspec-mocks (3.9.1)
      diff-lcs (>= 1.2.0, < 2.0)
      rspec-support (~> 3.9.0)
    rspec-support (3.9.2)
    ruby2_keywords (0.0.2)
    sinatra (2.0.8.1)
      mustermann (~> 1.0)
      rack (~> 2.0)
      rack-protection (= 2.0.8.1)
      tilt (~> 2.0)
    sinatra-activerecord (2.0.14)
      activerecord (>= 3.2)
      sinatra (>= 1.0)
    sinatra-contrib (2.0.8.1)
      backports (>= 2.8.2)
      multi_json
      mustermann (~> 1.0)
      rack-protection (= 2.0.8.1)
      sinatra (= 2.0.8.1)
      tilt (~> 2.0)
    sinatra-flash (0.3.0)
      sinatra (>= 1.0.0)
    thin (1.7.2)
      daemons (~> 1.0, >= 1.0.9)
      eventmachine (~> 1.0, >= 1.0.4)
      rack (>= 1, < 3)
    thread_safe (0.3.6)
    tilt (2.0.10)
    tzinfo (1.2.6)
      thread_safe (~> 0.1)

PLATFORMS
  ruby

DEPENDENCIES
  activerecord (= 5.2)
  bcrypt
  minitest (= 5.14.0)
  pg
  pry-byebug
  rack-test
  rake
  rspec
  sinatra
  sinatra-activerecord
  sinatra-contrib
  sinatra-flash
  thin

BUNDLED WITH
   2.1.4

我已经尝试将所需的'sinatra/cookies‘放在helper文件中,并确保我捆绑了gem 'sinatra-contrib’。当我直接在app.rb文件中设置cookie时,它会起作用。有没有人能给我提点别的建议,我可以检查一下,或者问题出在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-28 07:54:53

当你使用require 'sinatra'时,会发生一些神奇的事情,这会把一堆东西带进作用域,并从本质上把你的app.rb变成Sinatra::Application的一个实例。cookies方法只在这样的实例上定义-它不会自动出现在其他类上。

您可能想要做的是将您的助手转换为真正的Sinatra风格的助手,方法是使其成为一个模块,然后使用helpers关键字加载它,这将只生成这些实例方法:

代码语言:javascript
复制
module SessionsHelper

  def sign_in(user)
    cookies[:remember_token] = { value: user.remember_token, expires:     20.years.from_now.utc }
    self.current_user = user
  end

...
end

在你的主文件中:

代码语言:javascript
复制
require './helpers/sessions_helper'
helpers SessionsHelper

...

post '/sign_in' do
  user = User.find_by(email: params[:email])
  if user && user.authenticate(params[:password])
    sign_in user
    redirect '/'
  else
  ...
end

你可能会喜欢read more about this in the README

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61973482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档