【发布时间】: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