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

时间:2015-05-12 12:28:31

标签: ruby-on-rails ruby ruby-on-rails-4 testing nested-forms

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

问题:如果没有正确输入两者的信息,我希望表单不要注册任何内容(非组织或成员)。

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

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

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

如何更改代码以进行调整?

观点:

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

部分/表格:

  <%= 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

1 个答案:

答案 0 :(得分:2)

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

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