Formulir Bersarang di Rails 4 tidak ditampilkan

Mohon maaf jika ini sudah dijawab tetapi saya tidak dapat menemukan apa pun yang dapat membantu saya. Saya seorang pemula dengan Rails jadi harap berhati-hati :D

Saya telah berusaha keras untuk membuat formulir bersarang berfungsi, saya yakin formulir bersarang saya berfungsi menggunakan Rails 3 dan demo Railscasts tahun lalu, tetapi Rails 4 mengalahkan saya.

Melihat log, kueri dijalankan untuk menarik data untuk tabel terkait, tetapi tidak ada yang ditampilkan dalam formulir.

Saya telah membaca banyak situs web, namun sejauh ini tidak ada yang membantu dan saya tidak tahu harus mulai dari mana. Artikel terbaru yang saya ikuti adalah http://www.createdbypete.com/articles/working-with-nested-forms-and-a-many-to-many-association-in-rails-4/

Masih tidak ada yang ditampilkan dalam tampilan.

Di mana saya mulai men-debug ini, mungkin instalasi Rails saya rusak?? Tapi saya mungkin melewatkan sesuatu yang penting.

Terima kasih, Royce

Sunting - Saya telah menambahkan beberapa pengontrol dan tampilan yang dimaksud

survei_controller.rb

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

  # GET /surveys
  # GET /surveys.json
  def index
    @surveys = Survey.all
  end

  # GET /surveys/1
  # GET /surveys/1.json
  def show
  end

  # GET /surveys/new
  def new
    @survey = Survey.new
  end

  # GET /surveys/1/edit
  def edit
  end

  # POST /surveys
  # POST /surveys.json
  def create
    @survey = Survey.new(survey_params)

    respond_to do |format|
      if @survey.save
        format.html { redirect_to @survey, notice: 'Survey was successfully created.' }
        format.json { render :show, status: :created, location: @survey }
      else
        format.html { render :new }
        format.json { render json: @survey.errors, status: :unprocessable_entity }
      end
    end
  end

  # 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 { render :show, status: :ok, location: @survey }
      else
        format.html { render :edit }
        format.json { render json: @survey.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /surveys/1
  # DELETE /surveys/1.json
  def destroy
    @survey.destroy
    respond_to do |format|
      format.html { redirect_to surveys_url, notice: 'Survey was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def answers
    @participants = Participant.all
    @questions = @survey.questions
  end

  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 => [:id, :content,
        :answers_attributes => [:id, :content, :participant_id]
      ])
    end
end

partisipan_controller.rb

class ParticipantsController < ApplicationController
  before_action :set_participant, only: [:show, :edit, :update, :destroy]

  # GET /participants
  # GET /participants.json
  def index
    @participants = Participant.all
  end

  # GET /participants/1
  # GET /participants/1.json
  def show
  end

  # GET /participants/new
  def new
    @participant = Participant.new
  end

  # GET /participants/1/edit
  def edit
  end

  # POST /participants
  # POST /participants.json
  def create
    @participant = Participant.new(participant_params)

    respond_to do |format|
      if @participant.save
        format.html { redirect_to @participant, notice: 'Participant was successfully created.' }
        format.json { render :show, status: :created, location: @participant }
      else
        format.html { render :new }
        format.json { render json: @participant.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /participants/1
  # PATCH/PUT /participants/1.json
  def update
    respond_to do |format|
      if @participant.update(participant_params)
        format.html { redirect_to @participant, notice: 'Participant was successfully updated.' }
        format.json { render :show, status: :ok, location: @participant }
      else
        format.html { render :edit }
        format.json { render json: @participant.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /participants/1
  # DELETE /participants/1.json
  def destroy
    @participant.destroy
    respond_to do |format|
      format.html { redirect_to participants_url, notice: 'Participant was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def participant_params
      params.require(:participant).permit(:name)
    end
end

aplikasi_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
end

jawaban.html.erb

<h1><%= @survey.name %> Answers</h1>

<%= form_for(@survey) do |f| %>
  <% @participants.each do |participant| -%>
  <h3><%= participant.name %></h3>
  <table>
    <thead>
      <tr>
        <td>Questions</td>
        <td>Answer</td>
      </tr>
    </thead>
    <tbody>
      <% @questions.each do |question| -%>
      <tr>
        <td><%= question.content %></td>
        <td>
        <%= f.fields_for :questions, question do |q| -%>
          <%= q.fields_for :answers, question.answers.find_or_initialize_by(participant: participant) do |a| -%>
            <%= a.text_area :content %>
            <%= a.hidden_field :participant_id, participant.id %>
          <% end -%>
        <% end -%>
        </td>
      </tr>
      <% end -%>
    </tbody>
  </table>
  <% end -%>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end -%>

person Royceybaby    schedule 14.08.2014    source sumber
comment
Saran cepat: posting sedikit kode di sini. Mungkin metode pengontrol dan tampilan itu sendiri.   -  person mylescarrick    schedule 14.08.2014
comment
Cheers Myles, semoga membantu.   -  person Royceybaby    schedule 14.08.2014
comment
silakan posting konten model survei. Anda mungkin kehilangan accept_nested_attributes_for :questions   -  person coorasse    schedule 14.08.2014
comment
Formulir bersarang jelek, membingungkan, dan rapuh - dan Anda harus ingat untuk melakukan banyak hal kecil dengan benar di seluruh tumpukan. Anda dapat membuat segalanya lebih mudah untuk dipahami dan membantu mengisolasi perubahan dengan menggunakan objek formulir. Objek bentuk berpura-pura menjadi model, sehingga mereka bekerja dengan cara yang sama seperti model ketika berhadapan dengan pengontrol atau tampilan. Ada Railscast profesional tentang hal itu, atau lihat: stackoverflow.com/questions/25296385/   -  person A Fader Darkly    schedule 14.08.2014
comment
Kelihatannya menarik, harus dibaca   -  person Royceybaby    schedule 14.08.2014


Jawaban (3)


Karena Anda baru menggunakan Rails, izinkan saya menjelaskan cara kerja formulir bersarang untuk Anda!

--

Bersarang

Formulir Bersarang sebenarnya tidak bertumpuk sama sekali - formulir tersebut adalah formulir asosiatif.

Anda harus ingat bahwa Rails (karena dibangun di atas Ruby) adalah berorientasi objek< /em> kerangka kerja. OOP (pemrograman berorientasi objek) bukan sekadar kata kunci - ini adalah konstruksi inti mendasar untuk aplikasi Anda & cara aplikasi menyerahkan input/eksekusi.

Masalah yang dihadapi banyak orang adalah mereka tidak menyadari sifat sebenarnya dari Rails, dan akibatnya menjadi bingung tentang cara kerja banyak fiturnya. Jika Anda menghargai bahwa semua yang Anda lakukan di Rails harus dibangun di sekitar objek, hidup menjadi lebih sederhana!

masukkan deskripsi gambar di sini

--

Formulir

Dengan mengingat hal ini, Anda dapat mulai menghargai peran objects di seluruh Rails, hingga pada tingkat yang Anda perlukan untuk membangun/memanggil objek untuk setiap elemen aplikasi Rails Anda, termasuk formulir Anda:

#app/models/survey.rb
Class Survey < ActiveRecord::Base
   has_many :questions
   accepts_nested_attributes_for :questions
end

#app/controllers/surveys_controller.rb
Class SurveysController < ApplicationController
   def new
       @survey = Survey.new
       @survey.questions.build #-> very important
   end
end

#app/views/surveys/new.html.erb
<%= form_for @survey do |f| %>
   ...
   <%= f.fields_for :questions do |q| %>
      <%= q.text_field :title %>
   <% end %>
   <%= f.submit %>
<% end %>

Ini akan membuat formulir yang memungkinkan Anda meneruskan data asosiatif ke model anak Anda. Ada beberapa elemen penting yang perlu dipertimbangkan:

  1. Anda perlu menyertakan accepts_nested_attributes_for dalam model "induk" Anda
  2. Anda perlu build objek asosiatif Anda
  3. Anda perlu mengisi formulir Anda dengan objek relatif

Dengan mengikuti pola sederhana ini, Anda akan dapat mengisi formulir bersarang yang ingin Anda tampilkan dalam tampilan

person Richard Peck    schedule 14.08.2014
comment
Terima kasih Kaya, saya melewatkan @survey.questions.build Hanya perlu mencari tahu mengapa proyek utama saya tidak berfungsi sekarang! Permasalahan yang sama. - person Royceybaby; 14.08.2014
comment
Tidak masalah - apa masalah dengan proyek utama Anda? Mungkin kita bisa memperbaikinya? - person Richard Peck; 14.08.2014
comment
Masalah yang sama Kaya, formulir tidak menampilkan atribut bersarang. Kode di atas adalah upaya untuk mencari tahu mengapa tidak berhasil. Telah melakukan hal yang persis sama di proyek utama tetapi tidak dapat dirender. - person Royceybaby; 14.08.2014

Coba gunakan kode berikut:

<%= f.fields_for :questions do |q| -%>
      <%= q.fields_for :answers, q.object.answers.find_or_initialize_by(participant: f.object.participant) do |a| -%>
        <%= a.text_area :content %>
        <%= a.hidden_field :participant_id, participant.id %>
      <% end -%>
    <% end -%>

dan pastikan Anda merender ke answers.html.erb, Anda memiliki accepts_nested_attributes_for :questions di file survey.rb, dan accepts_nested_attributes_for :answers di file question.rb

person Mohamed Yakout    schedule 14.08.2014

Apakah Anda memiliki Accepts_nested_attributes_for :question dalam model survei Anda? Dan hal yang sama untuk model jawabannya?

person Ralph King    schedule 14.08.2014