2016-08-02 90 views
0

這個問題是關於Rails 4/postgresql的,應用程序託管在Heroku上。在Formtastic(Rails)中編輯/創建嵌套資源

我正在一個網站上進行測驗功能,我很想知道如何實現這些表格(使用Formtastic),以便儘可能簡化。我有三種模式:

  • 測驗(has_many:quiz_questions),例如, 「測試看看你有多棒」
  • QuizQuestion(belongs_to:quiz,has_many:quiz_options)。例如「1.你最喜歡哪種顏色」
  • QuizOption(belongs_to:quiz_question)。例如「藍」

我已經設置了形式是這樣的:

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

在形式如下:

<%= 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 %> 

然而它似乎,沒有工作的方式我想要。我希望能夠以這種形式看到QuizQuestion和QuizOptions的字段(有這些對象),但我沒有。

更重要的是,我希望能夠創建一個新的QuizQuestion,然後在這種形式的QuizOption。它不一定是jQuery/ajax或任何東西,但我想從這種形式做到這一切。

基本上,我想我的工作流程是這樣的:

  1. 創建一個測驗,並添加值給它。點擊創建。
  2. 添加QuizQuestion第一個並添加值(如「名稱標籤」)。點擊創建。
  3. 添加與QuizQuestion第一號相關的QuizOption及其「名稱標籤」。點擊創建。
  4. 重複QuizQuestion/QuizOption,直到測驗完成。

我該怎麼做?

回答

1

對於您的工作流程,您可能需要爲嵌套資源添加accept_nested_attributes_for,這種方式在創建對象對象時實際上可以創建嵌套的子對象(只要它們滿足所有驗證)。通過這種方式:

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

與像聲明:

has_many :quiz_questions 
accepts_nested_attributes_for :quiz_questions 
Quiz模型

你實際上就可以從測驗模型創建QuizQuestion像:

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

在做對於深度嵌套的關聯也是一樣的。


也許你爲什麼不看錶格上的任何領域的原因是因爲沒有嵌套創建的對象。讓我解釋。當你創建一個新的測驗對象,你quizs_controller(或任何用於測驗拐點是......),你需要:

def new 
    quiz = Quiz.new() 
end 

def create 
    Quiz.new(quiz_params) 
end 

private 

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

,如果你真的希望能夠請參閱表格中的字段,您必須使用build方法,並實際使用相應的嵌套資源填充新對象。

請注意,爲了與表單一起使用,您必須在quizzes_controller白名單中列出正確的屬性。一旦您發送新的測驗規則並檢查一切正確,您可以調試您收到的參數。

提示!如果你不想在動態添加嵌套資源時擔心JS,我推薦你使用cocoon gem

+1

像魅力一樣工作,尤其是使用'cocoon'。謝謝! – Christoffer