2013-05-30 39 views
2

嗨我已经走了虽然Railscast 196 & 197,并得到了一切工作,但我有一个关于扩展功能的问题。Rails演员#196 /#197嵌套模型代

在Railscast的结尾196 & 197(http://railscasts.com/episodes/197-nested-model-form-part-2)Ryan添加一个问题,然后单独添加答案。我试图实现的是添加问题时自动添加答案。

下面是该项目代码:http://railscasts.com/episodes/196-nested-model-form-revised(或更旧的版本,如果你没有订阅:http://railscasts.com/episodes/197-nested-model-form-part-2

有一个在评论部分暗示该行child_object = f.object.class.reflect_on_association(association).klass.reflect_on_association(child_association).klass.new加到帮手评论做到这一点,但是当我实现这个我得到的错误:

undefined method 'klass' for nil:NilClass

编辑:要清楚,它与这个错误试图建立child_object时失败。 new_object将生成并正确呈现。

我改变的辅助

def link_to_add_fields(name, f, association, container, child_association) 
    new_object = f.object.class.reflect_on_association(association).klass.new 
    child_object = f.object.class.reflect_on_association(association).klass.reflect_on_association(child_association).klass.new 
    new_object.answers = child_object 

    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder| 
    render(association.to_s + "/" + association.to_s.singularize + "_fields", :f => builder) 
    end 

    link_to name, "#", class: "add-fields", data: { container: "#{container}", association: "#{association}", content: "#{fields}" } 
end 

电话帮手

= form_for @survey, :html => { :multipart => true } do |f| 
    %fieldset 
    %legend 
     Questions 
    #questions.nested 
     = f.fields_for :questions do |question| 
     = render 'questions/question_fields', :f => question 
    = link_to_add_fields "Add Question", f, :questions, "questions", :image 
+0

可能有关。 http://stackoverflow.com/questions/5746006/has-many-through-nested-form-that-c​​an-build-multiple-instances – jdl

+0

谢谢,我看了看,看来我的'link_to_add_fileds'在外面'fields_for'块。我提出了修改,显示了我的整个表单。 –

回答

4

好吧,终于得到这个想通了!

<%= form_for @survey do |f| %> 
    <% if @survey.errors.any? %> 
    <div class="error_messages"> 
     <h2><%= pluralize(@survey.errors.count, "error") %> prohibited this survey from being saved:</h2> 
     <ul> 
     <% @survey.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 

    <%= f.fields_for :questions do |builder| %> 
    <%= render 'question_fields', f: builder %> 
    <% end %> 
    <%= link_to_add_fields "Add Question", f, :questions, :answers %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

助手

module ApplicationHelper 
    def link_to_add_fields(name, f, association, child_association = nil) 
    new_object = f.object.send(association).klass.new 

    if child_association 
     3.times{ new_object.send(child_association).build } #Builds 3 Answers 
     #new_object.send(child_association).build #Builds 1 Answer 
    end 

    id = new_object.object_id 

    fields = f.fields_for(association, new_object, child_index: id) do |builder| 
     render(association.to_s.singularize + "_fields", f: builder) 
    end 

    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")}) 
    end 
end 

child_association = nil

if child_association 
    3.times{ new_object.send(child_association).build } #Builds 3 Answers 
    #new_object.send(child_association).build #Builds 1 Answer 
end 

在那里,因为通过该链接还增加了新的答案ü ses相同的助手,但由于答案不接受任何嵌套的属性,它会失败。通过添加上述内容,您可以为两者使用相同的助手并保持干爽。

+0

谢谢!你的回答救了我。它的作品非常漂亮。 –