【发布时间】:2017-12-10 22:33:38
【问题描述】:
当我尝试保存 @list 时,在我的 Lists_Controllers 中撬开之后,我一直遇到“回滚事务”错误
我正在使用嵌套表单,当我窥探@list.invites 时,它显示invite.id 为nil(但电子邮件在那里)。我想知道这是否是原因。
[3] pry(#<ListsController>)> @list.invites
=> [#<Invite:0x007f91de392e30
id: nil,
accepted: nil,
exp_date: nil,
email: "sldkfjsdf@email.com",
invite_code: nil,
list_id: nil,
user_id: nil,
created_at: nil,
updated_at: nil>]
这是我的列表控制器
class ListsController < ApplicationController
before_action :authenticate_user!
def new
@list = List.new
@list.invites.build
end
def create
@list = List.create(list_params)
@list.users << current_user
@list.admin_id = current_user.id
binding.pry
if @list.save
redirect_to @list
else
render :new
end
end
private
def list_params
params.require(:list).permit(:name, invites_attributes: [:email])
end
end
这是我的 List.rb
class List < ApplicationRecord
has_many :lists_users
has_many :users, through: :lists_users
has_many :chores
has_many :invites
accepts_nested_attributes_for :invites , reject_if: proc { |attributes|
attributes['email'].blank? }
validates :name, presence: true
end
还有我的 Invites.rb
class Invite < ApplicationRecord
belongs_to :list
belongs_to :user
end
还有我的列表和邀请表架构
create_table "invites", force: :cascade do |t|
t.boolean "accepted"
t.datetime "exp_date"
t.string "email"
t.string "invite_code"
t.integer "list_id"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "lists", force: :cascade do |t|
t.string "name"
t.string "list_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "admin_id"
end
还有我的表格
<%= form_for(@list) do |f| %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %><br>
Invites:
<%= f.fields_for :invites do |invite| %>
<%= invite.label :email %>
<%= invite.text_field :email %>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
当我在 pry 中尝试 @list.save 时出现了错误
pry(#<ListsController>)> @list.save
(0.1ms) begin transaction
(0.1ms) rollback transaction
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
你能展示你的 Invites 模型吗?看起来您可能需要在您的关系中设置
inverse_of选项。这可能会发生,因为所有这些模型都在尝试保存,因为它们不知道彼此正在创建,所以它们没有通过验证。inverse_of让 Rails 知道关系并保存事务。 -
我刚刚用邀请模型更新了问题。我现在将研究 inverse_of 选项。
-
好的,我想我找到了问题所在。当我删除 User 和 Invite 之间的 has_many 和 belongs_to 关系时,它起作用了。现在试图弄清楚如何保持这种关系,因为我需要 Users.invites 来确定谁被邀请
标签: ruby-on-rails nested-forms