2016-03-23 15 views
0

Ich habe eine Rails 4 App. In dieser App habe ich mehrere HABTM-Beziehungen zwischen verschiedenen Modellen. Zum Beispiel kann eine Aufgabe viele Lernziele sowie viele damit verbundene Aufgaben haben. Im Moment habe ich das Bearbeitungsformular im modalen Dialog, das den Aufgabensatz bearbeitet und über den edit_task_path (@task) aufgerufen wird, der den Datensatz aktualisiert. Ich möchte ein neues Formular erstellen, das auch die Aktualisierungsaktion ausführt. Ich möchte jedoch nur, dass dieses Formular für die Aktualisierung der Zuordnungen für die Aufgaben verwendet wird. Meine Hauptfrage lautet: Wie erstelle und rufe ich ein zweites Formular auf, um zu der Aktualisierungsaktion für denselben Datensatz zu routen? Ich möchte grundsätzlich einen update_task_path (@task), der auch die Update-Controller-Aktion behandelt. Ich habe verschiedene Stack-Überläufe untersucht, und keiner adressiert ein neues Formular für die Update-Controller-Aktion.Ein neues Formular zum Aktualisieren eines Datensatzes in Rails 4

Antwort

1

Da Sie an den gleichen Ort routen müssen Sie nicht wirklich etwas anderes tun als eine separate Form teilweise. Ich nehme an, dass die Aufgabe an dem Punkt gültig sein müsste, an dem Sie die Assoziationen ändern, und die Assoziationen wären gültig (oder Sie haben nichts, um assoziierte Objekte zu validieren), sonst würde bei einem Fehler das Hauptformular gerendert Sie haben den Controller eingesetzt.

# main_form 
<%= form_for @task do |f| %> 
    <div class="field"> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    </div> 
<% end %> 

# mission_and_learning_objective_form 
<%= form_for @task do |f| %> 
    <div class="field"> 
    <%= f.collection_check_boxes :mission_ids, Mission.all, :id, :name %> 
    </div> 

    <div class="field"> 
    <%= f.collection_check_boxes :learning_objective_ids, LearningObjective.all, :id, :name %> 
    </div> 
<% end %> 

Sie sich anschauen sollten dafür nur einen separaten Controller mit obwohl

Routen

resources :task_settings, only: [:edit, :update] 

-Controller

class TaskSettingsController < ApplicationController 
    def edit 
    @task = Task.find(params[:id]) 
    end 

    def update 
    @task = Task.find(params[:id]) 
    if @task.update(task_setting_params) 
     redirect_to @task, notice: "Settings Updated" 
    else 
     render :edit 
    end 
    end 

    private 

    def task_setting_params 
    params.require(:task).permit(mission_ids: [], learning_objective_ids: []) 
    end 
end 

Ansicht

# task_settings/edit 
<%= form_for @task, url: task_setting_path(@task) do |f| %> 
    <div class="field"> 
    <%= f.collection_check_boxes :mission_ids, Mission.all, :id, :name %> 
    </div> 

    <div class="field"> 
    <%= f.collection_check_boxes :learning_objective_ids, LearningObjective.all, :id, :name %> 
    </div> 
<% end %> 

Für mich ist ein separater Controller ein bisschen sauberer, besonders wenn Sie ein anderes Verhalten haben wollen, wenn Sie nur die Verknüpfungen aktualisieren.

+0

Sorry, habe vergessen, die URL zum Formular hinzuzufügen. –

+0

Oh, das macht Sinn! Meine einzige Frage ist, wie man den Edit-Pfad verwendet, um zwei Anrufe 2 verschiedene Formulare anzurufen? Ich bin neu in Ruby on Rails. Ich lehne mich dem Einstellungs-Controller zu, ich versuche nur, beide Optionen zu ändern, da ich auch Einstellungs-Controller für ungefähr 4 andere Modelle machen muss. –

+0

Sie hätten zwei getrennte Pfade. '<% = link_to" Edit ", edit_task_path (@task)%>' und '<% = link_to" Taskeinstellungen bearbeiten ", edit_task_setting_path (@task)%>'. Beachten Sie, dass Sie sie wie gewünscht aufrufen können, es müssen keine Einstellungen sein. Ich konnte mir einfach kein gutes Team vorstellen, um Missionen und Lernziele zu gruppieren. –

Verwandte Themen