我正在try 通过一种GraphQL变异来清除用户会话,该变异以user_id为参数,销毁用户会话并发送一条消息,该消息将进一步被前端用来注销.

  argument :user_id, ID, required: true
  field :message, String, null: true

  def resolve(user_id:)
    user = User.find_by(id: user_id)
    raise GraphQL::ExecutionError, 'User not found.' unless user.present?
    destroy_user_session(user_id)
    user.save!
    { message: 'User session cleared'}
  end
  
  private

  def destroy_user_session(user_id)
    binding.pry
    session = context[:session]
    session.clear
    raise GraphQL::ExecutionError, 'Failed to clear session.' unless session.empty?
  end
end

但问题是,用户会话在这里没有被正确销毁.我正在使用localhost:3000/api/graphql测试它,其中我首先调用Mutations ,然后调用一些其他查询,这些查询在用户登录后可以访问,不幸的是,这两个查询都被调用,而不是抛出像authorization is requried这样的错误.我从不同的站点try 了几个步骤,但仍然被困在这里.

推荐答案

由于您的GraphQL_CONTROLLER继承自APPLICATION_CONTROLLER,因此如果您使用devise,则应该可以访问sign_out方法,因此如果您try 调用context[:controller].sign_out,它应该可以工作

  def destroy_user_session(user_id)
    context[:controller].sign_out
    session = context[:session]
    session.clear
    raise GraphQL::ExecutionError, 'Failed to clear session.' unless session.empty?
  end

Ruby-on-rails相关问答推荐

确定当前太平洋时区是PST还是PDT

发送不调用类或模块中的私有方法

rails turbo frame 显然在更新,但浏览器窗口保持不变

如何在测试期间为 Rails 应用程序启用 Rails.cache 会话对象

Ruby 3 动态关键字参数

Rails 3.1 assets资源 - 奇怪的开发服务

Rails:序列化数据库中的对象?

Rails:用于创建固定长度 char(12) 列的迁移

Rails 将字符串与视图中的变量连接的最佳方法

rake assets:precompile try 连接到数据库

Rspec:测试实例变量的赋值

Rails cron 与时俱进,设置环境

Ruby on Rails 取消首字母大写

注册表单上是否需要 CSRF 保护?

耙路由错误缺少:路由定义上的操作键

Ruby on Rails 中的MySQL 服务器已经消失

错误未初始化的常量 AWS (NameError)

确认后如何进行设计重定向

rails 单数资源还是复数?

ActiveModel::MissingAttributeError:无法使用 FactoryGirl 写入未知属性ad_id