嵌套表单:如果没有输入 child 的信息,则不应保存

Nested form: shouldn't save if no information for child is entered

我有一个嵌套表单来注册一个新组织和 1 个成员(1:组织与其成员之间的多种关系)。两者在模型文件和迁移文件中都有验证。

问题:如果两者的信息输入不正确,我希望表格不要注册任何东西(不是组织或成员)。

目前,当我注册一个新组织但将成员的所有变量留空时,它会在没有错误消息的情况下注册该组织,并且不会注册任何成员。

相反,我希望它也尝试写入成员,然后产生错误消息,因为成员的某些变量不允许为空。由于该错误,在成员信息也正确之前,它也不应保存组织。

如果我为成员输入一些信息,这确实可以正常工作:如果成员无效,它不会保存组织或成员并给出错误。如果我为成员输入有效信息而没有为组织输入信息,它也可以正常工作:它会产生错误并且不保存任何内容。但是,如果我为组织输入有效信息而没有为成员输入任何信息,它就不起作用:它不会产生任何错误并且只保存组织。

我应该如何更改我的代码来调整它?


观点:

<%= render partial: "registrationform", locals: { url: organizations_path } %>

partial/form:

  <%= form_for @organization, url: url do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <h4>Details of the organization:</h4>
    <%= f.text_field :name, class: 'form-control' %>

    <%= f.fields_for :members do |p| %>
      <h4>Your personal details:</h4>
      <%= p.text_field :username, class: 'form-control' %>
      <%= p.email_field :email, class: 'form-control' %>
      <%= p.password_field :password, class: 'form-control' %>
      <%= p.password_field :password_confirmation, class: 'form-control' %>
    <% end %>

    <%= f.submit "Sign up", class: "formbutton btn btn-default" %>
  <% end %>

控制器:

  def new
    if (logged_in?)
      flash[:danger] = "You're already logged in"
      redirect_to root_url
    end
    @organization = Organization.new
    @member = @organization.members.build
  end

  def create
    @organization = Organization.new(new_params)
    if @organization.save
      @organization.members.each do |single_member|
        single_member.send_activation_email
      end
      flash[:success] = "Please check your email to activate your account."
      redirect_to root_url
    else                            
      @organization.members.build if @organization.members.blank?
      render 'new'
    end
  end

private
def new_params
  params.require(:organization).permit(:name,
                 members_attributes: [:email,
                                      :username,
                                      :password,
                                      :password_confirmation
                                      ])
end

在您的组织模型中,您可以检查成员

class Organization
   validate :check_member
   def check_member
      if members.empty?
         errors.add(:base, 'Member is not present')
      end
   end
end