gpt4 book ai didi

ruby-on-rails - accepts_nested_attributes_for 验证和使用 find_or_create_by

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:53 25 4
gpt4 key购买 nike

我有一个user 模型和一个town 模型。一个用户属于一个城镇:

# models/user.rb
class User < ApplicationRecord
belongs_to :town
accepts_nested_attributes_for :town
validates :last_name, presence: true
end


# models/town.rb
class Town < ApplicationRecord
has_many :users
validates :name, presence: true
validates :name, uniqueness: true
end

你去创建一个新的user 记录:有一个text_box 用来输入相关城镇的name。提交后,Rails 应用程序应执行以下操作:

  • 使用find_or_create_by。去检查是否已经存在一个带有 name 属性的 town 记录。
    • 如果 town 记录确实存在具有给定 name 属性的记录,只需将现有的 town 记录关联到这个新的 user 记录
    • 如果 town 记录不存在具有给定 name 属性的记录,则使用该 name< 创建一个新的 town 记录 属性,并将该属性关联到此 user 记录
  • 如果任何验证失败,请不要创建 user 记录或 town 记录并重新呈现表单。

我遇到了真正的麻烦。 This question建议将 autosave 放在 belongs_to :town 语句中,并定义一个名为 autosave_associated_records_for_town 的方法。但是:我就是无法让它工作。

欣赏!

最佳答案

请尝试该解决方案。它对我有用。

用户

# user.rb

class User < ActiveRecord::Base
belongs_to :town

accepts_nested_attributes_for :town
validates :last_name, presence: true
end

城镇

# town.rb

class Town < ActiveRecord::Base
has_many :users
validates :name, presence: true
end

Controller

# users_controller.rb

respond_to :html

def create

# ...
@user = User.new(user_params)
@user.town = Town.find_or_initialize_by(user_params[:town_attributes])
if @user.save
respond_with(@user)
else
render 'new'
end
end

# ...

def user_params
params.require(:user).permit(:last_name, :email, :town_id, town_attributes: [:name])
end

查看

# users/_form.html.erb

<%= form_for(@user) do |f| %>

<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

<ul>
<% @user.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

<div class="field">
<%= f.label :email %><br>
<%= f.text_field :email %>
</div>


<div class="field">
<%= f.label :last_name %><br>
<%= f.text_field :last_name %>
</div>

<%= f.fields_for :town, @town do |bldr| %>
<div class="field">
<%= bldr.label :name, 'Town name' %><br>
<%= bldr.text_field :name %>
</div>
<% end %>

<div class="actions">
<%= f.submit %>
</div>
<% end %>

Validations

更新

请考虑将 validates_associated 添加到用户验证中。这是相关的documentaion

class User < ActiveRecord::Base
belongs_to :town

accepts_nested_attributes_for :town
validates :last_name, presence: true
validates :town, presence: true
validates_associated :town
end

enter image description here

一般来说,在这种情况下,您可以删除 validates :town, presence: true。验证将在没有它的情况下工作。

关于ruby-on-rails - accepts_nested_attributes_for 验证和使用 find_or_create_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37622669/

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