2013-09-22 45 views
59

düzenlerken kopya üretiyor Ryan Bates RailsCast #196: Nested model form part 1 takip etmeye çalışıyorum. Ryans versiyonuna göre iki belirgin fark var: 1) Kullandığı gibi yapı iskelesi kullanıyorum ve 2) Rayları çalıştırıyorum 4 (Ryans'ın kendi versiyonunda hangi versiyonu kullandığını bilmiyorum) ama 4 değil.RoR iç içe öznitelikleri,

Yani burada ben çok

class Question < ActiveRecord::Base 
    belongs_to :survey 
end 

gibi modellere dernek eklendi Sonra

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 

yaptı ve böylece

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

Sonra iç içe bakış bölümünü ekledi ne

ve yeni bir anket üç soru ile yeni bir anket hazırlayarak, Yani

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 

örneği her 3 soru oluşturulan bu gayet böylece nihayet kontrolör. Ancak, anketlerden birini düzenlemeye çalışırsam, orijinal üç soru korunur, diğer üç soru daha oluşturulur. Bunun yerine düzenlenen anket için 3 soru sahip, şimdi bildiğim kadarıyla yapıyorum ben, bu yürütülmez söyleyebilirim 6. denetleyicisi yeni yönteme

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

eklendi, ve bir düzenleme işlemi. Bana yanlış yaptığımı söyleyen var mı?

Herhangi bir yardım büyük beğeni topluyor!

+0

orada hatalarını kontrol böylece ekleyebilir, düzenleyebilir ve denetleyici koduna eylemleri güncelleyebilirim? – Almaron

+0

Elbette! Tahminimce darlığın altarında bir şey kayboldu. – conciliator

cevap

145

Ben de anladım. :id'u survey_params yönteminde izin verilen paramlara eklemek zorunda kaldım. Şimdi şu şekilde görünüyor: mükemmel şekilde çalışan bu

# 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 

. Ben bir RoR acemiyim, lütfen bunun analizini bir tuz tohumu ile al, ama sanırım güncelleme işlemine geçilmek yerine yeni kimliğin oluşturulduğunu tahmin ediyorum. Umarım bu, başka birisine yardım eder.

+1

Yardımcı ipucu, teşekkürler! (Düzenleme: Sadece söylüyorum çünkü çoğu insan kendi sorusunu yanıtlarken kendi sorusunu cevaplamıyor.) –

+2

Elbette! SO'ya birçok kez döndüm, bu sadece bir şeyleri geri vermeye çalışmak için adil. :) – conciliator

+1

da burada bir RoR acemi. Beni kurtardın! Ben bu iç içe geçmiş formlarda 2 gün geçirdim ve sadece bu nispeten basit uygulama lol yapılan almaya çalışıyorum. – dtc

7

Rails 4'teki cocoon gemini kullanarak, düzenleme sırasında izin verilen listeye :id ekledikten sonra bile hala çift alanları oluyordum. hem şu fark

Unpermitted parameters: _destroy 
Unpermitted parameters: _destroy 

Yani müsaade model_attributes: alana :_destroy alanını eklendi ve bundan sonra işler sorunsuz çalıştı. Örneğin

...

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