2016-08-02 24 views
0

Diese Frage bezieht sich auf Rails 4/postgresql und die App wird auf Heroku gehostet.Bearbeiten/erstellen verschachtelte Ressourcen in Formtastic (Rails)

Ich mache eine Quiz-Funktionalität auf einer Website und ich frage mich, wie man die Formulare (mit Formstastic) am besten implementiert, um dies so einfach wie möglich zu machen. Ich habe drei Modelle:

  • Quiz (has_many: quiz_questions), z.B. "Testen, um zu sehen, wie toll Sie sind"
  • QuizQuestion (gehört zu: Quiz, has_many: quiz_options). z.B. "1. Welche ist Ihre Lieblingsfarbe?"
  • QuizOption (gehört zu: quiz_question). z.B. "Blue"

ich die Formulare wie folgt aufgebaut haben:

<%= semantic_form_for([:admin, @quiz], :url => admin_quiz_path(@quiz.id)) do |f| %> 
    <%= render 'form' , :f => f %> 
<% end %> 

wo die Form wie folgt aussieht:

<%= f.inputs %> 

<h3>Quiz questions</h3> 
<%= f.semantic_fields_for :quiz_questions do |qq_f| %> 
    <%= qq_f.inputs %> 

    <h4>Quiz options</h4> 
    <%= qq_f.semantic_fields_for :quiz_options do |qqo_f| %> 
     <%= qqo_f.inputs %> 
    <% end %> 

<% end %> 

<%= f.actions do %> 
    <%= f.action :submit %> 
    or go <%= link_to 'back', admin_quizzes_path %> 
<% end %> 

Es scheint jedoch nicht die Art und Weise zu arbeiten, Ich will. Ich erwarte, die Felder von QuizQuestion und QuizOptions in dieser Form zu sehen (es gibt Objekte für diese), aber ich nicht.

Noch wichtiger ist, dass ich in der Lage wäre, eine neue QuizQuestion und anschließend QuizOption in dieser Form zu erstellen. Es muss nicht unbedingt jQuery/ajax oder irgendetwas anderes sein, aber ich möchte alles von diesem Formular aus machen.

Grundsätzlich würde ich meinen Workflow sein wie mag:

  1. ein Quiz erstellen und Werte hinzufügen. Klicken Sie auf Erstellen.
  2. Fügen Sie QuizQuestion Nummer eins hinzu und fügen Sie die Werte hinzu (wie "name label"). Klicken Sie auf Erstellen.
  3. Fügen Sie QuizOption hinzu, das sich auf QuizQuestion number 1 und seine "name label" bezieht. Klicken Sie auf Erstellen.
  4. Wiederholen Sie für QuizQuestion/QuizOption, bis das Quiz abgeschlossen ist.

Wie kann ich das tun?

Antwort

1

Für Ihren Workflow müssen Sie möglicherweise accept_nested_attributes_for für die verschachtelten Ressourcen hinzufügen. Auf diese Weise können Sie beim Erstellen eines Objektobjekts tatsächlich verschachtelte untergeordnete Elemente erstellen (sofern sie alle Validierungen erfüllen). Auf diese Weise:

# A quiz :has_many :quiz_questions 
@quiz = Quiz.create(...) 

mit einer Erklärung wie:

has_many :quiz_questions 
accepts_nested_attributes_for :quiz_questions 

in Ihrem Quiz Modell Sie QuizQuestion aus dem Quiz Modell tatsächlich in der Lage sein zu schaffen wie:

# using the previously quiz model 
quiz.quiz_questions.create(...) 

des Doing Gleiches gilt für die tief verschachtelten Assoziationen, die den gleichen Effekt haben.

Der Grund, warum Sie kein Feld in dem Formular anzeigen, liegt möglicherweise daran, dass kein verschachteltes Objekt erstellt wurde. Lassen Sie mich erklären.Wenn Sie ein neues Quiz-Objekt erstellen, in Ihrem quizs_controller (oder was auch immer die Wende für Quiz ist ...) benötigen Sie ein:

def new 
    quiz = Quiz.new() 
end 

und

def create 
    Quiz.new(quiz_params) 
end 

private 

def quiz_params 
    # whitelisted parameters sent along with the form 
    params.require(:quiz).permit(...) 
end 

, wenn Sie tatsächlich in der Lage sein wollen Wenn Sie die Felder im Formular sehen, müssen Sie die Methode build verwenden und das neue Objekt mit den verschachtelten Ressourcen füllen.

Beachten Sie, dass für die Verwendung mit diesem Formular die richtigen Attribute in der quizzes_controller whitelist müssen. Sie können die Params, die Sie erhalten, debuggen, sobald Sie das neue Quizformular gesendet haben und prüfen, ob alles richtig ist.

TIPP! Wenn Sie sich nicht um die JS kümmern wollen, wenn Sie verschachtelte Ressourcen dynamisch hinzufügen, empfehle ich Ihnen, die cocoon gem

+1

Arbeitete wie ein Charme, vor allem mit der Verwendung von "Kokon". Vielen Dank! – Christoffer

Verwandte Themen