【问题标题】:Rails rollback transaction when saving保存时Rails回滚事务
【发布时间】: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


【解决方案1】:

问题是我的用户和邀请之间的 has_many 和 belongs_to 关系。发送邀请时,如果系统中存在电子邮件,则为拥有该电子邮件的用户分配邀请。在创建列表时,如果邀请电子邮件不属于拥有帐户的人,则没有 user_id 可分配给新邀请。我必须弄清楚我将如何完成此操作,但原来的错误已修复。

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2013-01-17
    • 2012-07-13
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    相关资源
    最近更新 更多