2016-07-14 6 views
0

liebe Kollegen Programmierer,verschachtelte Formularparameter leer? Probleme

Ich habe ein kleines Problem mit meiner verschachtelten Form in einer anderen Form .. hier ist, was ich versuche zu tun, diese aktuelle Form ist Besitzer zu current_customer hinzufügen. Aber innerhalb dieses Formulars gibt es eine geschachtelte Form, um die Telefonnummer des Besitzers in die Telefontabelle einzugeben, die von der Besitzertabelle getrennt ist - daher das verschachtelte Formular. Benutzer müssen ihren Eigentümernamen eingeben, um einen neuen Besitzer zu erstellen, aber die Telefonnummer kann später hinzugefügt werden. Die genannte Form ist wie folgt:

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

Das telephone.rb Modell ist wie folgt:

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 

das Problem, das ich mit meinem Code bin vor ist, dass selbst mein: nummernfeld in dieser form gefüllt ist, die nummer kann nicht in die telefontabelle eingetragen werden. Ist es so, als ob Rails mein: Nummernfeld nicht erkennen könnte? oder nicht. wenn da etwas ist was ich falsch mache? Vielen Dank für Ihre Hilfe!

Antwort

1

Bei verschachtelten Formularen gibt Ihre verschachtelte Beziehung telephone_attributes einen Hashwert für Hashwerte zurück, wobei jeder untergeordnete Hashwert einen anderen Telefondatensatz darstellen kann. Hier ist, was die params aussehen, wenn sie auf Ihre Bewerbung eingereicht werden (vorausgesetzt, 1 Telefon zur Verfügung gestellt wurde):

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

Also in diesem Fall Ihr Anruf number_blank? immer true sein wird, weil es kein :number Wert als Direkttaste ist zum :telephones_attributes Hash. Stattdessen müssen Sie in die Werte dieses Hashes eintauchen, um zu sehen, ob irgendwelche Zahlen gesetzt wurden. So etwas wie dies funktionieren könnte (nicht getestet):

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

Dies baut ein neues Array mit allen angegebenen Zahlen aus den verschachtelten Feldern entfernt alle leere Elemente und prüft, ob das Array leer ist. Wenn es leer ist, gibt es keine Nummern, ansonsten war mindestens eine Nummer vorhanden.

Dies scheint mir jedoch eine Menge Arbeit für ein Problem, das Rails für Sie bereits gelöst haben könnte. Haben Sie die :reject_if Option für den accepts_nested_attributes_for Anruf auf Ihrem Owner Modell untersucht? Möglicherweise können Sie damit alle Parameter zurückweisen, deren Nummer leer ist, sodass in der Telefontabelle kein Datensatz erstellt wird. Dies würde helfen, die bedingte Logik aus Ihrem Controller #create Aktion zu beseitigen. Überprüfen Sie die Dokumentation für ActiveRecord::NestedAttributes.

+0

Danke !!! Die Lösung, die Sie gegeben haben, hat geholfen. Ich werde versuchen und experimentieren mit dem: reject_if später. Nochmals vielen Dank für Ihren tollen Zeiger! –

Verwandte Themen