gpt4 book ai didi

ruby-on-rails - 从 _form 或 Controller 保存的当前用户 ID

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:40 26 4
gpt4 key购买 nike

我正在使用 Devise 来管理用户,我的目标是让当前用户与创建的记录一起保存。

我曾尝试将当前用户保存在 Controller 或 _form 中,但无论哪种方式都失败了!

谢谢大家的帮助。

我的记录模型

class Record < ActiveRecord::Base
#Associations
belongs_to :user


# Validations
validates :title, :user, presence: true
end

我的记录 Controller

class RecordsController < ApplicationController
before_action :find_record, only: [:show, :edit, :update, :destroy]

def create
@record = Record.new(record_params)

if @record.save
redirect_to @record
else
@records = Record.all
render 'index'
end
end

def update
if @record.update(record_params)
flash[:notice] = "The record was updated successfully"
redirect_to @record
else
render 'edit'
end
end

private

def find_record
@record = Record.find(params[:id])
end

def record_params
params.require(:record).permit(:title, :description, :user_id).merge(user: current_user) # as suggested
end
end

我的 Rspec

require 'rails_helper'

describe RecordsController do
let(:record) { create(:record) }
let(:user) { create(:user) }
let(:title) { "Some title I would like to put in my record" }
let(:description) { "description I would like to put in my record" }


describe "#create" do
it "creates a new record with the given title and description" do
expect do
post :create, record: { title: title, description: description, user_id: user }
end.to change { Record.count }.by(1)

expect(response).to redirect_to(assigns[:record])

expect(assigns[:record].title).to eq(title)
expect(assigns[:record].description).to eq(description)
end

it "fails to create a record and returns to the index page" do
expect(post :create, record: { description: description }).to render_template(:index)
expect(assigns[:records]).to eq(Record.all)
end
end

describe "#update" do
it "find the records and sets the new given values" do
put :update, { id: record.id, record: { title: title, description: description } }

record.reload
expect(record.title).to eq(title)
expect(record.description).to eq(description)

expect(flash[:notice]).to eq("The record was updated successfully")
end

it "fails to create a record and returns to the edit page" do
expect(put :update, { id: record.id, record: { title: "" } }).to render_template(:edit)
end
end
end

现在保存当前用户 Rspec 在创建和更新时抛出错误:

1) RecordsController#create creates a new record with the given title and description
Failure/Error: post :create, record: { title: title, description: description, user_id: user }
NoMethodError:
undefined method `authenticate' for nil:NilClass
# ./app/controllers/records_controller.rb:42:in `record_params'
# ./app/controllers/records_controller.rb:9:in `create'
# ./spec/controllers/records_controller_spec.rb:36:in `block (4 levels) in <top (required)>'
# ./spec/controllers/records_controller_spec.rb:35:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'

2) RecordsController#create fails to create a record and returns to the index page
Failure/Error: expect(post :create, record: { description: description }).to render_template(:index)
NoMethodError:
undefined method `authenticate' for nil:NilClass
# ./app/controllers/records_controller.rb:42:in `record_params'
# ./app/controllers/records_controller.rb:9:in `create'
# ./spec/controllers/records_controller_spec.rb:46:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'

3) RecordsController#update find the records and sets the new given values
Failure/Error: put :update, { id: record.id, record: { title: title, description: description } }
NoMethodError:
undefined method `authenticate' for nil:NilClass
# ./app/controllers/records_controller.rb:42:in `record_params'
# ./app/controllers/records_controller.rb:20:in `update'
# ./spec/controllers/records_controller_spec.rb:62:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'

4) RecordsController#update fails to create a record and returns to the edit page
Failure/Error: expect(put :update, { id: record.id, record: { title: "" } }).to render_template(:edit)
NoMethodError:
undefined method `authenticate' for nil:NilClass
# ./app/controllers/records_controller.rb:42:in `record_params'
# ./app/controllers/records_controller.rb:20:in `update'
# ./spec/controllers/records_controller_spec.rb:72:in `block (3 levels) in <top (required)>'

最佳答案

要添加到 bo-oz 的答案(应该有效),您还需要查看 foreign keys .尝试在您的 record 表单中设置 record_id 根本行不通,我认为您对系统如何使用这项重要技术的解释存在误解。

具体来说,您需要确保在保存新的记录 之前填充您的user_id 属性。这是一个关系数据库规范,而不是 Rails:

enter image description here

每次在 Rails 中创建关联时,必须在数据库中设置外键以启用 ActiveRecord (Rails 中的对象关联构建器)将适当的数据组合在一起:

#app/models/user.rb
class User < ActiveRecord::Base
has_many :records
end

#app/models/record.rb
class Record < ActiveRecord:Base
#see diagram above -- this has to have user_id in the schema :)
belongs_to :user
end

--

您遇到的问题是您在创建记录时没有设置您的用户外键

你的记录表应该有一个user_id外键,这样当Rails拉出一个Record对象时,它就能找到与之关联的 User

正如 bo-oz 所解释的,您可以通过设置 @record.user 来实现这一点,您可以在参数中设置它:

#app/controllers/records_controller.rb
class RecordsController < ApplicationController
def create
@record = Record.new record_params
@record.save ..........
end

private

def record_params
params.require(:record).permit(......).merge(user: current_user)
end
end

这两个答案都会在您的新 Record 对象中设置适当的外键。

关于ruby-on-rails - 从 _form 或 Controller 保存的当前用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com