2016-04-13 2 views
0

Я пытаюсь добавить функцию опроса в приложение из учебника Rails от Hartl. Начаты следующие #196 Nested Model Form и Nested forms with Rails 4.2 Strong Parameters. После отправки формы содержимое сохраняется в базе данных должным образом, однако я не могу видеть результаты на странице показа и не могу понять, почему.Вложенная форма, не отображающая представленный контент на странице показа

модели-

class Micropost < ActiveRecord::Base 
    has_many :polls, dependent: :destroy 
    accepts_nested_attributes_for :polls, :reject_if => lambda {|a| a[:content].blank? } 

    def questions_for_form 
    collection = polls.where(micropost_id: id) 
    collection.any? ? collection : polls.build 
    end 
end 

class Poll < ActiveRecord::Base 
    belongs_to :micropost 
    has_many :answers, dependent: :destroy 
    accepts_nested_attributes_for :answers, :reject_if => lambda {|a| a[:content].blank? } 

    def answers_for_form 
    collection = answers.where(micropost_id: id) 
    collection.any? ? collection : answers.build 
    end 
end 

class Answer < ActiveRecord::Base 
    belongs_to :poll 
end 

Controllers-

class StaticPagesController < ApplicationController 
    def home 
    if logged_in? 
     @micropost = current_user.microposts.build 
     @poll = @micropost.polls.build 
     3.times {@poll.answers.build} 
     @feed_items = current_user.feed.paginate(page: params[:page]) 
    end 
    end 
end 

class MicropostsController < ApplicationController 
    def create 
    @micropost = current_user.microposts.build(micropost_params) 
    if @micropost.save 
     flash[:success] = "Micropost created!" 
     redirect_to root_url 
    else 
     @feed_items = [] 
     render 'static_pages/home' 
    end 
    end 

    private 

    def micropost_params 
     params.require(:micropost).permit(:content, polls_attributes: [:content, :id, :micropost_id, answers_attributes: [:content, :id, :poll_id]]) 
    end 
end 

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    @microposts = @user.microposts.paginate(page: params[:page]) 
    end 
end 

Routes-

Rails.application.routes.draw do 
    resources :microposts,   only: [:create, :destroy] 
    resources :polls 
    resources :answers 
end 

Views-

_micropost_form.html.erb

<%= form_for(@micropost) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.text_area :content, placeholder: "Compose new post..." %> 
    </div> 

    <button type="button" class="btn btn-default btn-xs" data-toggle="collapse" data-target="#pollcollapse" id="pollbtn">Poll</button> 

    <div id="pollcollapse" class="collapse"> 
    <%= f.fields_for :polls do |questions_for_form| %> 
    <%= render 'shared/poll_fields', :f => questions_for_form %> 
    <% end %> 
    </div> 

    <%= f.submit "Post", class: "btn btn-primary" %> 
<% end %> 

_poll_fields.html.erb

<div class="field"> 
    <%= f.text_field :content, placeholder: "Poll question..." %> 
</div> 

<%= f.fields_for :answers do |answers_for_form| %> 
    <%= render 'shared/answer_fields', :f => answers_for_form %> 
<% end %> 

_answer_fields.html.erb

<div> 
    <%= f.text_field :content, placeholder: "Answer" %> 
</div> 

show.html.erb

<% provide(:title, @user.name) %> 
<div class="row"> 
    <aside class="col-md-4"> 
    <section class="user_info"> 
     <h1> 
     <%= gravatar_for @user %> 
     <%= @user.name %> 
     </h1> 
    </section> 
    </aside> 
    <div class="col-md-8"> 
    <% if @user.microposts.any? %> 
     <h3>Posts (<%= @user.microposts.count %>)</h3> 
     <ol class="microposts"> 
     <%= render @microposts %> 
     </ol> 
     <%= will_paginate @microposts %> 
    <% end %> 
    </div> 
</div> 

_micropost.html.erb

<li id="micropost-<%= micropost.id %>"> 

    <span class="content"><%= micropost.content %></span> 

    <span> 
    <% for poll in @micropost.polls %> //Poll & answer content do not appear. 
     <%= poll.content %> 
     <% for answer in poll.answers %> 
      <%= answer.content %> 
     <% end %> 
    <% end %> 
    </span> 

</li> 

Я думаю, что это должно быть все соответствующей информации, но, пожалуйста, дайте мне знать, если я что-нибудь не хватает. Большое спасибо за любую помощь!

ответ

0

В вашем _micropost.html.erb частичном, вы ссылаетесь на @micropost, который нигде не определен. Попробуйте изменить это значение из переменной экземпляра в локальную переменную micropost (узнайте о разнице между @micropost и microposthere). Кроме того, в Ruby рекомендуется людям умнее меня (по крайней мере, у меня есть read it несколько раз), что вы должны использовать .each вместо for. Обновленный код в ваш парциальное:

<li id="micropost-<%= micropost.id %>"> 

    <span class="content"><%= micropost.content %></span> 

    <span> 
    <% micropost.polls.each do |poll| %> 
     <%= poll.content %> 
     <% poll.answers.each do |answer| %> 
      <%= answer.content %> 
     <% end %> 
    <% end %> 
    </span> 

</li> 

Кроме того, так как вы определяете @microposts в вашем шоу действия, вы можете реорганизовывать свой код в представлении шоу так:

<div class="col-md-8"> 
    <% if @microposts.any? %> 
     <h3>Posts (<%= @microposts.count %>)</h3> 
     <ol class="microposts"> 
     <%= render @microposts %> 
     </ol> 
     <%= will_paginate @microposts %> 
    <% end %> 
    </div> 
+0

Спасибо за помощь, @ Джон. Я обновил сообщение, чтобы включить то, что я раньше имел для действия шоу диспетчера, а также полную страницу показа.Я знаю, что контент из микросообщества успешно создается и отображается, однако это всего лишь содержимое из вложенной формы внутри микропоста, которая не появляется. Я попытался добавить '@polls = @ micropost.polls' и' @answers = @ polls.answers', но не удалось. Ранее я предполагал, что они не нужны. Bc другие вложенные формы (ссылки выше) не включали дочерние элементы в действие show, но, возможно, я использую неправильный код. – chrxtina

+0

Не похоже, чтобы вы определяли '@ micropost' где угодно. Попробуйте изменить '@ micropost' на' micropost' (удалите '@') в частичном '_micropost'. Кроме того, хотя я не думаю, что это влияет на вас, я читал в нескольких местах, что, в общем, вы должны использовать '.each' вместо' for' в ruby. Разные между ними суммируются в этом S.O. answer: http://stackoverflow.com/questions/3294509/for-vs-each-in-ruby. Я обновляю свой ответ, чтобы включить точное изменение кода. – John

+0

Еще одна вещь, это всего лишь мнение, поэтому я включаю его в качестве комментария, но я много сделал с вложенными формами/'accepts_nested_attributes_for' /' fields_for' в моем собственном приложении и, узнав о превосходном камне Reform, я ЖЕЛАЮ, что я использовал это. Похоже, что у вас уже есть этот код, который почти работает, но если вы будете больше работать с вложенными формами, я бы серьезно подумал о том, чтобы переключиться на этот камень. https://github.com/apotonick/reform – John

0

Да экземпляр vs. Local переменных. Я бы сказал, что было бы проще использовать ген, но если вы изучаете рельсы, и у вас есть время, мое мнение лучше всего сделать это в первый раз. Это помогает вам изучить структуру и лучше решать проблемы, когда вы сталкиваетесь с чем-то, для которого нет драгоценного камня. Изучив себя, идите с драгоценным камнем, если найдете, что он действительно служит вашей цели ... Или сделайте свой собственный камень! Приветствия.