2013-09-22 13 views
59

Ich versuche, Ryan Bates RailsCast #196: Nested model form part 1 zu folgen. Es gibt zwei offensichtliche Unterschiede zur Ryans-Version: 1) Ich verwende ein eingebautes Gerüst und nicht raffiniert, wie er es benutzt, und 2) Ich leite Schienen 4 (Ich weiß nicht, welche Version Ryans in seiner Besetzung verwendet , aber es ist nicht 4).RoR geschachtelte Attribute erzeugt Duplikate beim Bearbeiten

Also hier ist, was ich tat

rails new survey2 
cd survey2 
bundle install 
rails generate scaffold survey name:string 
rake db:migrate 
rails generate model question survey_id:integer content:text 
rake db:migrate 

Dann habe ich die Assoziationen zu den Modellen wie so

class Question < ActiveRecord::Base 
    belongs_to :survey 
end 

und so

class Survey < ActiveRecord::Base 
    has_many :questions 
    accepts_nested_attributes_for :questions 
end 

Dann habe ich die verschachtelte Ansicht Teil

<%= form_for(@survey) do |f| %> 
    <!-- Standard rails 4 view stuff --> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.fields_for :questions do |builder| %> 
     <div> 
     <%= builder.label :content, "Question" %><br/> 
     <%= builder.text_area :content, :rows => 3 %> 
     </div> 
    <% end %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

und schließlich die Steuerung so, dass drei Fragen erstellt werden, wenn eine neue Umfrage

class SurveysController < ApplicationController 
    before_action :set_survey, only: [:show, :edit, :update, :destroy] 

    # Standard rails 4 index and show 

    # GET /surveys/new 
    def new 
    @survey = Survey.new 
    3.times { @survey.questions.build } 
    Rails.logger.debug("New method executed") 
    end 

    # GET /surveys/1/edit 
    def edit 
    end 

    # Standard rails 4 create 

    # PATCH/PUT /surveys/1 
    # PATCH/PUT /surveys/1.json 
    def update 
    respond_to do |format| 
     if @survey.update(survey_params) 
     format.html { redirect_to @survey, notice: 'Survey was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @survey.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # Standard rails 4 destroy 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_survey 
     @survey = Survey.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def survey_params 
     params.require(:survey).permit(:name, questions_attributes: [:content]) 
    end 
end 

So instanziert wird, eine neue Umfrage mit drei Fragen zu schaffen ist in Ordnung. Wenn ich jedoch versuche, eine der Umfragen zu bearbeiten, werden die ursprünglichen drei Fragen beibehalten, während drei weitere erstellt werden. Anstatt also drei Fragen, die für die bearbeitete Umfrage, ich habe jetzt 6. Ich

Rails.logger.debug("New method executed") 

das neue Verfahren in der Steuerung hinzugefügt, und soweit ich das beurteilen kann, ist es nicht ausgeführt wird, wenn ich tue eine Bearbeitungsoperation Kann mir jemand sagen, was ich falsch mache?

Jede Hilfe wird sehr geschätzt!

+0

können Sie den Bearbeitungs hinzufügen und Aktionen zu Ihrem Controller-Code aktualisieren, so dass wir für die Fehler überprüfen kann? – Almaron

+0

Sicher Sache! Ich nehme an, etwas ist auf dem Altar der Kürze verloren gegangen. – conciliator

Antwort

145

Also habe ich es herausgefunden. Ich musste :id zu den erlaubten Parametern in der survey_params Methode hinzufügen. Es sieht jetzt so aus:

# Never trust parameters from the scary internet, only allow the white list through. 
def survey_params 
    params.require(:survey).permit(:name, questions_attributes: [:id, :content]) 
end 

was perfekt funktioniert. Ich bin ein RoR-Neuling, also bitte nehmen Sie meine Analyse davon mit einem Körnchen Salz, aber ich denke, dass neue IDs generiert wurden, anstatt an die Update-Aktion übergeben werden. Hoffe, das hilft jemand anderem da draußen.

+1

Hilfreicher Tipp, danke! (edit: nur sagen, weil die meisten Leute nicht ihre eigene Frage beantworten, wenn sie es herausfinden ..) –

+2

Sicher Ding! Ich habe mich so oft an SO gewandt, dass es nur fair ist, etwas zurückzugeben. :) – conciliator

+1

auch ein RoR-Neuling hier. du hast mich gerettet! Ich habe 2 Tage mit diesen verschachtelten Formularen verbracht und versuche nur, diese relativ einfache App fertig zu bekommen, lol. – dtc

7

Mit cocoon Gem auf Rails 4, bekam ich immer noch doppelte Felder, auch nach dem Hinzufügen :id zu den zulässigen Liste beim Bearbeiten. auch bemerkt die folgenden

Unpermitted parameters: _destroy 
Unpermitted parameters: _destroy 

So habe ich das :_destroy Feld auf das zulässige model_attributes: Feld und alles funktioniert reibungslos danach.

Zum Beispiel ...

def survey_params 
    params.require(:survey).permit(:name, questions_attributes: [:id, :content, :_destroy]) 
end 
Verwandte Themen