我的嵌套表单在另一个表单中遇到了一点问题。这是我正在尝试做的,目前的形式是将所有者添加到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
我的代码面临的问题是,即使我的:此表单中的数字字段已填写,该号码也无法输入电话表。是否好像导轨无法检测到我的:数字字段是空白的?或不。如果有什么我做错了?非常感谢你的帮助!
答案 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的文档。