【问题标题】:Rails form with nested attributes saving twice具有嵌套属性的 Rails 表单保存两次
【发布时间】:2020-05-17 17:02:56
【问题描述】:

将rails表单与嵌套表单集成,一切正常,但问题是记录保存多次。

app/models/user.rb

has_many :badges, :dependent => :destroy
accepts_nested_attributes_for :badges, :allow_destroy => true, reject_if:  proc { |attributes| attributes['badge_type'] == "0" }

app/models/badge.rb

belongs_to :user_id

app/controllers/user_controller.rb

def new
    @user = User.new
    @user.badges.build
end

def create
   @user = User.new(user_params)
   @user.save!
end

private
def user_params
    params.require(:user).permit(:name,:email,badges_attributes: [:id, :badge_type,:_destroy])
end   

app/views/users/_form.html.erb

<%= f.fields_for :badges do |ff| %>
    <%= ff.check_box :badge_type %>
    <label>Admin</label>
<% end %>

但它是保存记录两次。如何解决?

【问题讨论】:

  • 是否为用户和徽章保存重复记录?还是一个用户但有重复的徽章?
  • 仅用于徽章
  • 你能举一个你提交表单时发送的参数的例子吗?

标签: ruby-on-rails ruby ruby-on-rails-3 has-many


【解决方案1】:

创建新的User 时,您只需将:badges 属性作为user_params 的一部分传递

user_controller.rb

def create
  @user = User.new(user_params)
  @user.save
end

def user_params
  params.require(:user).permit(:name, :phone, :email, attributes_for_badges: %i[id badge_type _destroy])
end

【讨论】:

  • 我更新了我的问题并使用了许可参数,但它仍在创建重复记录
  • 尝试调用 User.new(user_params) 然后保存它。无需去@user.badges.build。
  • 再次删除@user.badges.build 并仅使用我的代码。端点应根据您的:new 方法。我使用了:create,因为我正在关注 REST。对你来说,代码应该在你的 :new 方法中
  • 如果我们在新操作中删除@user.badges.build 那么它将如何在表单中显示..请写下您的新操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多