【问题标题】:Hitting "Filter Chain Unauthorized" during POST request, in React / Ruby on Rails Feature在 React / Ruby on Rails 功能中,在 POST 请求期间点击“过滤链未经授权”
【发布时间】:2018-12-19 20:06:08
【问题描述】:

第一个堆栈溢出问题,所以我为忘记事情提前道歉。

项目:

  • 公告功能,允许管理员/版主在网站上发布公告。

使用的工具/语言:

  • React / Ruby on Rails,设计(用于登录)

历史:

  • 公告功能已启动并正在运行;直到我在我的公告表中添加了一个“用户名”字段。我正确更新了迁移/模式,并对控制器进行了调整,以允许新字段以及 React 表单将新字段传递到公告对象中。

错误:

  • 在使用新字段更新迁移/模式文件、更新公告控制器以允许新字段并更新 React 表单以通过 AXIOS POST 请求捕获并发布新的“公告”对象后,我收到以下错误:“过滤器链停止为:authenticate_user!渲染或重定向”401未授权等。

到目前为止我尝试过的事情:

  • 我已经验证了应该在公告对象中的所有数据,就在通过 POST 请求推送之前,它应该在哪里。 (见下图)

  • 我尝试使用 Binding.Pry,它的工作原理类似于 Javascript 的“调试器”,除了 Ruby,但我的 binding.pry 并没有在公告控制器中停止任何地方,这让我相信 POST 请求不是甚至在出现下面的错误之前,都不会到达announcements_controller。

  • 我已经验证了 Announcements 表应该是什么。

  • 我已将新字段设置为在公告控制器中允许使用

代码示例/图片:

处理提交 POST 请求

  handleSubmit = (announcement) => { axios.post(`/api/announcements`, announcement)}

Contents of "announcement" JUST before being passed into handleSubmit()

Filter Chain Halted as :authenticate_user! rendered or redirect: Error Message AFTER POST request

Announcements schema / database / table

ActiveRecord::Schema.define(版本:2018_12_19_224825)做

    # These are extensions that must be enabled in order to support this 
  database
    enable_extension "plpgsql"

    create_table "accounts", force: :cascade do |t|
      t.string "account_name"
      t.bigint "users_id"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.index ["users_id"], name: "index_accounts_on_users_id"
    end

    create_table "announcements", force: :cascade do |t|
      t.string "body"
      t.bigint "user_id"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.index ["user_id"], name: "index_announcements_on_user_id"
    end

    create_table "games", force: :cascade do |t|
      t.string "game_name"
      t.bigint "accounts_id"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.index ["accounts_id"], name: "index_games_on_accounts_id"
    end

    create_table "team_has_tournaments", force: :cascade do |t|
      t.bigint "tournament_id"
      t.bigint "team_id"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.index ["team_id"], name: "index_team_has_tournaments_on_team_id"
      t.index ["tournament_id"], name: "index_team_has_tournaments_on_tournament_id"
    end

    create_table "teams", force: :cascade do |t|
      t.string "team_name"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
    end

    create_table "tournaments", force: :cascade do |t|
      t.text "tournament_description"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.string "tournament_name"
    end

    create_table "user_has_teams", force: :cascade do |t|
      t.bigint "user_id"
      t.bigint "team_id"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.index ["team_id"], name: "index_user_has_teams_on_team_id"
      t.index ["user_id"], name: "index_user_has_teams_on_user_id"
    end

    create_table "users", force: :cascade do |t|
      t.string "provider", default: "email", null: false
      t.string "uid", default: "", null: false
      t.string "encrypted_password", default: "", null: false
      t.string "reset_password_token"
      t.datetime "reset_password_sent_at"
      t.boolean "allow_password_change", default: false
      t.datetime "remember_created_at"
      t.integer "sign_in_count", default: 0, null: false
      t.datetime "current_sign_in_at"
      t.datetime "last_sign_in_at"
      t.string "current_sign_in_ip"
      t.string "last_sign_in_ip"
      t.string "confirmation_token"
      t.datetime "confirmed_at"
      t.datetime "confirmation_sent_at"
      t.string "unconfirmed_email"
      t.string "firstName"
      t.string "lastName"
      t.string "username"
      t.string "image"
      t.string "email"
      t.json "tokens"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.integer "level", default: 1
      t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
      t.index ["email"], name: "index_users_on_email", unique: true
      t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
      t.index ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true
    end

    add_foreign_key "accounts", "users", column: "users_id"
    add_foreign_key "announcements", "users"
    add_foreign_key "games", "accounts", column: "accounts_id"
    add_foreign_key "team_has_tournaments", "teams"
    add_foreign_key "team_has_tournaments", "tournaments"
    add_foreign_key "user_has_teams", "teams"
    add_foreign_key "user_has_teams", "users"
  end

Announcements controller that should be handling POST request (1)

Announcements controller that should be handling POST request (2)

    class Api::AnnouncementsController < ApplicationController
    before_action :set_announcement, only: [:show, :update, :destroy]

    def index
      render json: Announcement.all.order("created_at DESC")
    end

    def show
      render json: @announcement
    end


    def new
      @announcement = Announcement.new
    end

    def edit
    end

    def create
      announcement = Announcement.new(announcement_params)

      if announcement.save
        render json: build_announcement(announcement)
      else
        render json: announcement.errors, status: 422
      end
    end

    def update
      if @announcement.update(announcement_params)
        render json: @announcement
      else
        render json: @announcement.errors, status: 422
      end
    end

    def destroy
      @announcement.destroy
    end

    private

    def build_announcement(announcement)
      {
        id: announcement.id,
        body: announcement.body,
        username: announcement.username,
        user_id: announcement.user_id,
        created_at: announcement.created_at,
        updated_at: announcement.updated_at,
      }
    end

    def set_announcement
      @announcement = Announcement.find(params[:id])
    end

    def announcement_params
      params.require(:announcement).permit(:body, :username, :user_id)
    end
    end

【问题讨论】:

  • 请您将所有图片替换为实际文字好吗?在某些设备上可能难以查看图像。并且,图像使您无法将代码复制到答案中,在这种情况下,您要求我们查看您的所有图像、发现潜在问题、生成潜在解决方案并在我们的答案中重新输入更正的代码。这不是那么有趣。
  • 我很乐意!我还是新手。当我第一次尝试(仅放入代码)时,它似乎没有将其识别为实际代码。也许是因为它是 Ruby,我不确定。建议,以便保持缩进/突出显示?我会在此期间摆弄它。
  • 您的binding.pry 永远无法到达,因为正在发生暂停。 authenticate_user! 正在返回 401,因此您将永远无法访问您的 pry. 简而言之,您似乎没有登录。
  • @jvillian 不幸的是,从那以后我已经关闭/重新启动了终端。无论如何,复制/粘贴终端输出无助于调试问题。更有效的方法是阅读信息并根据自己的经验添加建议。
  • @fanta 你说得对,我也得出了同样的结论。刷新时,我被重定向到登录。我的困惑是为什么会发生停止。这是一个令人头疼的问题。更糟糕的是,当我吃完午饭回来再试一次时,它工作得非常好,我没有任何改变。我仍然认为,为了任何可能首先解释它为什么会发生的人而留下这个帖子是有益的,特别是考虑到实际问题从未弄清楚。

标签: ruby-on-rails ruby reactjs devise axios


【解决方案1】:

我注意到您的控制台输出包括:

User Load (50.0ms) SELECT "users".* FROM "users" WHERE "users"."uid" = $1 LIMIT $2 [["uid", "admin@admin.com"], ["LIMIT", 1]]

(尽管我有任何打字错误。)

您似乎正在尝试查找具有uid 或admin@admin.com 的用户。在您的 cmets 中(我认为现在已删除),您曾说过您没有这样的用户。如果是这种情况,那么我认为这就是导致您的原因:

Filter chain halted as :authenticate_user! rendered or redirected

我想我会从研究那一点开始。

【讨论】:

  • 这是有道理的。尽管它不能作为问题本身的答案。为什么它会尝试以 SELECT 语句开头?我在上面的 cmets 中提到,午饭回来后,POST 请求开始工作得很好,而无需我进行任何编辑。据我所知,SQL 方面的事情是由 Axios/Rails/whatever 处理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2012-10-23
相关资源
最近更新 更多