2016-06-22 14 views
0

Ich habe ein Formular in Seiten/contact.html.erbFormular für verschiedene Modell

<%= form_for @contact_form, url: pages_contact_path, :method => :post do |f| %> 

, aber ich möchte Daten an ein anderes Modell schicken, ich es als Contact erstellt haben, und es hat keinen Controller.

So in der Seiten-Controller ich so etwas wie diese haben (alle im Interesse dieser Frage vereinfacht ..

class PagesController < ApplicationController 
    def contact 
     @contact_form = ContactForm.new(contact_form_params) 
     @contact_form.save 
    end 

    private 

    def contact_form_params 
     params.require(:contact_form).permit(:name, :phone, :email, :subject, :message) 
    end 
end 

Wenn ich versuche, die Seite (Seiten/Kontakt) i diesen Fehler zu laden:

param is missing or the value is empty: contact_form 

Wenn ich die (contact_form_params) nehmen für die weiße Auflistung der Seite macht gut, aber natürlich alle Daten als Null gesendet. ich kann zwar auf dem Server sehen, dass der Hash das CONTACT_FORM hat so i don 'T was sonst noch zu tun ..

Parameters: {"utf8"=>"✓", "authenticity_token"=>"qjfdt/4PgAjImpbB8Q3wJIJZnvQddIB1DmD0NdER6aM2265323AiahJr4fDh8XO6nyUISMsEEExn0f3EFcsbbA==", "contact_form"=>{"name"=>"Pedrinho", "phone"=>"", "email"=>"", "subject"=>"", "message"=>""}, "commit"=>"Update Contact form"} 

bitte hilfe!

Antwort

1

Ah, sieht aus wie das mit Ihrem form for another model Thema verbunden ist. Okay, breiter gesprochen, das Problem ist, dass Sie versuchen, zwei Dinge zu verwechseln: Erstellung eines Objekts und seine Gebäude. Rails guide lehrt uns, diese Dinge auf verschiedene Controller-Aktionen abzubilden, z.B. pages/build_contact und pages/create_contact. Die erste würde enthalten eine einfache alte

def build_contact 
    @contact_form = ContactForm.new 
end 

während letzteres ein Kontakt-Formular basierend auf weitergegeben params bauen würde und versuchen, sie zu retten:

def create_contact 
    @contact_form = ContactForm.new(contact_form_params) 
    if @contact_form.save 
    # redirect somewhere 
    else 
    # render build_contact view with @contact_form and show errors there 
    end 
end 

Beachten Sie, dass dies erfordert, dass Sie Ihre Ansicht ändern Dateien und Routen entsprechend.

Nun nehmen wir an, Sie haben einen starken Grund, nicht zwei getrennte Methoden zu haben.

DISCLAIMER: Ich würde dir nie raten, das zu tun, aber es ist mit bedingter Logik möglich. Sie sollten prüfen, ob contact_form Parameter erhalten werden, und falls sie dort sind, versuchen Sie ein Objekt zu speichern. Der umgekehrte Fall führt uns zu einem neuen. Beachten Sie, dass dies eine hässliche Variation von zwei Methoden ist, die oben erklärt wurde.

def contact 
    if got_contact_form? 
     @contact_form = ContactForm.new(contact_form_params) 
     @contact_form.save 
     # hint: what you gonna do if your save call failed due to validation errors? 
    else 
     @contact_form = ContactForm.new 
    end 
end 

private 

def got_contact_form? 
    # check if you've got required params 
    params["contact_form"].present? 
end 
Verwandte Themen