gpt4 book ai didi

ruby-on-rails - 使用 collection_select 并从 sqlite3 收到意外错误 - 有人知道为什么吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:52:59 26 4
gpt4 key购买 nike

我是 Ruby on Rails 的新手,在使用 collection_select 和让我的新表单成功提交时遇到问题。我的代码的一些背景:

  • 我有一个用户模型和一个付款模型;用户 has_many 付款,以及付款 belongs_to 用户。
  • 我正在使用 Devise 来管理用户登录,当用户登录时,他们可以通过表单添加新的付款。
  • 我正在使用 collection_select 生成与当前用户关联的电子邮件地址列表,可以通过表单选择。

我有两个问题,我认为这两个问题都源于我对 collection_select 的错误使用:

  1. 当我在表单上选择一个电子邮件地址并提交时,我收到一条错误消息,指出电子邮件地址不能为空,即使我已经提交了非空白条目。错误消息是我的支付模型中验证的结果,validates :email, :presence => true

  2. 我暂时注释掉了支付模型中的 :email 验证行,现在收到错误消息:SQLite3::SQLException: cannot start a transaction within a transaction : 开始交易

我花了一段时间试图弄清楚我做错了什么,但运气不好;我无法在 Stackoverflow 上的其他帖子中找到此问题。我猜这是一个简单的错误,但似乎无法弄清楚。有谁知道我做错了什么?

/app/models/payment.rb

require 'valid_email'

class Payment < ActiveRecord::Base
include ActiveModel::Validations

attr_accessible :amount, :description, :email, :frequency, :paid, :user_id
belongs_to :user

#validates :email, :presence => true, :email => true (commented out as described above)
validates :amount, :presence => true, :format => { :with => /^\d+??(?:\.\d{0,2})?$/ }, :numericality => {:greater_than => 0, :less_than => 100000}
validates :description, :presence => true
end

/app/models/user.rb

class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :email, :password, :password_confirmation, :remember_me
has_many :payments
end

/app/controllers/payments_controller.rb(只是创建和新建):

class PaymentsController < ApplicationController
before_filter :authenticate_user!
def create
@payment = current_user.payments.new(params[:payment])
@payment_current_user = current_user.payments.all

respond_to do |format|
if @payment.save
format.html { redirect_to payments_url, :flash => { notice: 'Payment was successfully created.' } }
format.json { render json: @payment, status: :created, location: @payment }
else
format.html { render action: "new" }
format.json { render json: @payment.errors, status: :unprocessable_entity }
end
end
end
def new
@payment = current_user.payments.new

# get list of current_user's email addresses in form
@payment_current_user = current_user.payments.all

respond_to do |format|
format.html # new.html.erb
format.json { render json: @payment }
end
end
end

/app/views/payments/_form.html.erb

<%= form_for(@payment) do |f| %>
<form class="form-horizontal">
<div class="field">
<div class="control-group">
<%= f.label :email, "Lendee's Email", class: "control-label" %><br />
<div class="controls">

<%= collection_select :payment, :user_id, @payment_current_user, :email, :email, {:include_blank => "Please select"} %>

</div>
</div>
</div>
<div class="control-group">
<div class="actions">
<div class="controls">
<%= f.submit %>
</div>
</div>
</div>
</form>
<% end %>

完整的错误消息,在我点击“提交”后出现:

ActiveRecord::StatementInvalid in PaymentsController#create
SQLite3::SQLException: cannot start a transaction within a transaction: begin transaction
  • 与错误相关的应用程序跟踪:

    app/controllers/payments_controller.rb:52:in block in create'
    app/controllers/payments_controller.rb:51:in
    create'

  • 与错误关联的请求参数:

    {"utf8"=>"✓", "authenticity_token"=>"K8+NnWHIIxVfcC5IvhLhoSKOzuScFrpnHOPTt1pVdpA=", “支付”=>{“user_id”=>“new@gmail.com”, "金额"=>"d", “频率”=>“每两周一次”, "描述"=>"adf", “已支付”=>“待处理”}, “提交”=>“创建付款”

最佳答案

我已经解决了我的问题。正如我在问题描述中提到的,我通过 validates :email, :presence => true 收到一条错误消息。 Email 不能为空,即使选择了电子邮件地址也是如此。我找到了 this post on Stackoverflow ,这帮助我意识到我在期待 :email , 不是 :user_id , 以表格形式提交。

因此,我将代码更改为以下内容:

<%= f.collection_select :email, current_user.payments, :email, :email, {:include_blank => "Please select"} %>

请注意,上面的内容也反射(reflect)了我在 View 中构建了一个 current_user 付款数组,而不是从模型中的实例化变量。

关于ruby-on-rails - 使用 collection_select 并从 sqlite3 收到意外错误 - 有人知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16743217/

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