2016-05-30 21 views
0

Alles funktioniert gut, aber ich möchte den Code ändern in erstellen Aktion zu etwas wie in Update Aktion. Gerade jetzt, in der Create-Aktion durchlaufe ich alle Werte und speichere sie, aber ich möchte es in einer einzigen Zeile machen.Rails verschachtelte Form - Refactor create action | Kokon Edelstein

Ich habe ein College-Modell.

class College< ActiveRecord::Base 
    has_many :staffs, dependent: :destroy 
    accepts_nested_attributes_for :staffs, reject_if: :all_blank, allow_destroy: true 
end 

Und das ist mein Staff.rb

class Staff < ActiveRecord::Base 
    belongs_to :college 
end 

Und das sind meine Staffs Controller erstellen und Update Aktionen

def create 
    @college= College.find(params[:college][:id_college_profile] 
) 
    staff_params = params[:college][:staffs_attributes].values 
    staff_params.each do |staff_param| 
    @staff = @college.staffs.new 
    @staff.name = staff_param[:name] 
    @staff.designation = staff_param[:designation] 
    @staff.experience = staff_param[:experience] 
    @staff.specialization = staff_param[:specialization] 
    @staff.save 
    end 
    redirect_to dashboard_path(id: @college.id), notice: "Successfully added Staff." 
end 

def update 
    @college= College.find(params[:college][:id_college] 
) 
    @college.update_attributes(staff_parameters) 
    redirect_to root_path 
end 

Dies sind starke Parameter

def staff_parameters 
    params.require(:college).permit(:id, staffs_attributes: [:id, :name, :specialization, :experience, :designation, :_destroy]) 
end 

Gibt es eine Möglichkeit, alle Mitarbeiter in create action zu speichern, ohne alle Werte durchzulaufen, aber alle mit einer einzigen Codezeile wie in der Aktualisierungsaktion zu speichern?

Ich habe schon versucht, diese in den StaffsController Aktion erstellen

def create 
    @college= College.find(params[:college][:id_college] 
) 
    @staff= @college.staffs.new(staff_parameters) 
    @staff.save 

    redirect_to dashboard_path(id: @college.id), notice: "Successfully added Staffs." 
end 

Aber es wirft diesen Fehler

unknown attribute 'staffs_attributes' for Staff. 

Kann mir jemand freundlicherweise mit diesem Problem helfen?

Antwort

1

Dies ist ein CollegesController so nehme ich an, die create Aktion schafft auch die neue Hochschule?

Also in diesem Fall Ihrer Aktion erstellen einfach sein sollte, so etwas wie:

def create 
    @college = College.new(staff_parameters) 
    if @college.save 
    # succesfully created 
    else 
    # there was a validation error 
    end 
end 

Beachten Sie, dass im Allgemeinen würden wir college_parameters verwenden, da das Wurzelelement college ist und dass Sie nicht nur das verschachtelte Personal bearbeiten, sondern auch möglicherweise Attribute von der Hochschule.

Wenn die Hochschule immer schon vorhanden ist (weil Sie ein find tun), es ist ein wenig verwirrend für mich, was der Unterschied zwischen create und update und warum nicht immer macht die edit Aktion in diesem Fall?

Ich habe eine demo-project Show-Casing Kokon und verschachtelte Attribute.

+0

Danke für die Eingabe. Hier ist der Fluss. Der Benutzer meldet sich an. Er wird dann zu einem Formular weitergeleitet. Nach dem Senden wird ein College- Objekt für diesen Benutzer erstellt. Dieses College-Objekt hat Stäbe, Kurse, etc. So in Stäbe Controller, ich erstelle Stäbe für diese bestimmte Hochschule. Und die create Aktion, die ich gepostet habe, ist in StaffsController. – Mahendhar

+0

In diesem Fall gibt es keinen Unterschied zwischen der Bearbeitung und der neuen Aktion, weil Sie immer das Formular für das College rendern und das College speichern, richtig? Ein bisschen verwirrend in Ihren Routen möglicherweise, weil Sie nicht eine einzelne Mitarbeiter erstellen oder bearbeiten, aber ein Haufen, so für mich fühlt sich ein College-Controller ein wenig mehr "Standard" einfallsreich. – nathanvda

+0

Danke @nathanvda. Ich rendere das Bearbeitungsformular für beide neu und bearbeite es jetzt. Ich werde den Code in den CollegesController verschieben. Eine kleine Frage. Ich habe auch "Kurse" für Colleges wie "Staffs". Wenn in Colleges # create, ich habe '@ college.update_attributes (staff_parameters)', wie man die starken Parameter ändert, so dass es auch 'course_parameters' erlaubt, wenn geschachtelte Kursform bearbeitet wird. – Mahendhar

0

Sie können dies auf viele Arten tun. Die Methode "staff_parameters" hat einen Fehler ausgegeben, weil Sie sie in der Klasse create für die Aktion create und für die Aktualisierungsaktion in der college-Klasse aufrufen. Das Einfachste, was Sie tun wollen, ist, die Parameter für die Parameter der Stabparameter zu kopieren und zu duplizieren. Benennen Sie diese zweite Methode create_staff und ändern Sie den Teil "params.require (: college)" in "params.require (: staff)" und lassen Sie den Rest unverändert. Dann können Sie in Ihrer Erstellungsaktion "college.staff (create_staff)" ausführen. Ich bin auf meinem Handy, so dass die Formatierung nicht gut ist lol ich setze den Code in Anführungszeichen.

+0

Danke für die Eingabe, aber es ist ein Fehler aufgetreten. 'def create_staff params.require (: Personal) .permit (staffs_attributes: [: id, Name,: Spezialisierung: Erfahrung: Bezeichnung: _destroy]) end' Dieser Code diesen Fehler wirft' param fehlt oder der Wert leer ist: staff' – Mahendhar

+0

Hier die params werden, wenn ich die Form vorgelegt '{ "UTF-8"=> "✓", "authenticity_token"=> "2JTUGSxkviYutVSkbmsNHfkAlHoxTOk70OPxsDTcyKlUKVFMJx5 + xF9RU6sZiXwIQqfNmOpw1NqnjJzJtrTHXQ ==",„College "=> {" stabs_attributes "=> {" 1464614354720 "=> {" name "=>" asdasd "," spezialisierung "=>" asdasd "," bezeichnung "=>" asdasd "," experience "=>" 12 "," _destroy "=>" false "}}," id_college "=>" 2 "}," commit "=>" Speichern "," controller "=>" staffs "," action "=>" create "} ' – Mahendhar

+0

In der Create-Aktion, ich ha ve das: '@staff = @ college.staffs.new (create_staff)' – Mahendhar