嵌套形式参数空白?问题

时间:2016-07-14 12:57:13

标签: ruby-on-rails ruby ruby-on-rails-4

亲爱的程序员,

我的嵌套表单在另一个表单中遇到了一点问题。这是我正在尝试做的,目前的形式是将所有者添加到current_customer。但是在这种形式中有一个嵌套的形式,用于将所有者的电话号码输入到电话表中,该表与所有者表分开 - 因此是嵌套表格。用户必须输入其所有者名称才能创建新所有者,但稍后可以添加电话号码。所述表格如下:

<%= form_for(@owner) do |f| %>
  <%= f.hidden_field :customer_id, :value => params[:id] %>

  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

  <%= f.fields_for :telephones do |t| %>
    <div class="form-group">
      <%= t.hidden_field :owner_id, :value => @owner.id %>

      <div class="number-type">
        <%= t.label :tel, "Contact number" %>
        <%= t.radio_button :numbertype, "mobile", :checked => false, :class => "numbertype mobile" %>
        <%= t.label :numbertype, "Mobile", :value => "mobile"  %>
        <%= t.radio_button :numbertype, "land", :class => "numbertype land" %>
        <%= t.label :numbertype, "Land", :value => "land" %>
      </div>

      <%= t.text_field :number, placeholder: "telephone number", class: 'form-control some_input' %>

      <%= t.text_field :ext, placeholder: "extension", id: "extension", class: 'form-control'%>
    </div>
  <% end %>

<%= f.submit "Add new owner", class: "btn btn-primary" %>

telephone.rb模型如下:

class Telephone < ActiveRecord::Base
  belongs_to :customer
  belongs_to :owner

  validates :owner_id,    presence: true, allow_blank: true
  validates :customer_id, presence: true, allow_blank: true
  validates :numbertype,  presence: true, allow_blank: true
  validates :number,      presence: true, allow_blank: true, 
                          length: { in: 7..10 }, uniqueness: { scope: [:ext] }, 
                          :numericality => {:only_integer => true}
  validates :ext,         presence: true, allow_blank: true
end

owners_controller.rb

def create
  @customer = Customer.find(params[:owner][:customer_id])
  @owner = Owner.find_by(customer_id: params[:id])

  if number_blank?
    @owner = @customer.owners.build(owner_params)
  else
    @owner = @customer.owners.build(owner_with_telephone_params)
  end

  if @owner.save
    @customer.update_attribute(:updated_at, Time.zone.now)
    flash[:success] = "New owner added!"
    redirect_to request.referrer
  else
    flash[:danger] = "no owner has been added."
    redirect_to @customer
  end
end

private

    def owner_with_telephone_params
      params.require(:owner).permit(:name, :email, :tel, telephones_attributes: [:numbertype, :number, :ext])
    end

    def owner_params
      params.require(:owner).permit(:name, :email, :tel)
    end

    def number_blank?
      params[:owner][:telephones_attributes][:number].blank?
    end

我的代码面临的问题是,即使我的:此表单中的数字字段已填写,该号码也无法输入电话表。是否好像导轨无法检测到我的:数字字段是空白的?或不。如果有什么我做错了?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

使用嵌套表单时,telephone_attributes的嵌套关系会返回哈希哈希,其中每个子哈希都可以表示不同的电话记录。以下是将params提交给您的应用程序时的样子(假设提供了1部电话):

{
  "owner" => {
    "telephones_attributes" => {
      "0" => {
        "number" => "555-1234"
      }
   }
}

因此,在这种情况下,您对number_blank?的调用始终为true,因为没有:number值作为:telephones_attributes哈希的直接键。相反,您需要深入了解该哈希的值,以查看是否已设置任何数字。这样的事情可能有用(未经测试):

def number_blank?
  params[:owner][:telephones_attributes].values.map { |telephone|
    telephone[:number]
  }.reject(&:blank?).empty?
end

这将从嵌套字段构建一个包含所有提供数字的新数组,删除所有空白元素,并检查数组是否为空。如果它是空的,则没有数字,否则至少提供一个数字。

然而,对于Rails可能已经为您解决的问题,这对我来说是一项很大的工作。您是否考虑在:reject_if模型上使用accepts_nested_attributes_for选项进行Owner调用?您可以使用它来拒绝任何数字为空的参数,这样就不会在电话表中创建记录。这有助于消除控制器#create操作中的条件逻辑。查看ActiveRecord::NestedAttributes的文档。