Я пытаюсь добавить функцию опроса в приложение из учебника 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>
Я думаю, что это должно быть все соответствующей информации, но, пожалуйста, дайте мне знать, если я что-нибудь не хватает. Большое спасибо за любую помощь!
Спасибо за помощь, @ Джон. Я обновил сообщение, чтобы включить то, что я раньше имел для действия шоу диспетчера, а также полную страницу показа.Я знаю, что контент из микросообщества успешно создается и отображается, однако это всего лишь содержимое из вложенной формы внутри микропоста, которая не появляется. Я попытался добавить '@polls = @ micropost.polls' и' @answers = @ polls.answers', но не удалось. Ранее я предполагал, что они не нужны. Bc другие вложенные формы (ссылки выше) не включали дочерние элементы в действие show, но, возможно, я использую неправильный код. – chrxtina
Не похоже, чтобы вы определяли '@ micropost' где угодно. Попробуйте изменить '@ micropost' на' micropost' (удалите '@') в частичном '_micropost'. Кроме того, хотя я не думаю, что это влияет на вас, я читал в нескольких местах, что, в общем, вы должны использовать '.each' вместо' for' в ruby. Разные между ними суммируются в этом S.O. answer: http://stackoverflow.com/questions/3294509/for-vs-each-in-ruby. Я обновляю свой ответ, чтобы включить точное изменение кода. – John
Еще одна вещь, это всего лишь мнение, поэтому я включаю его в качестве комментария, но я много сделал с вложенными формами/'accepts_nested_attributes_for' /' fields_for' в моем собственном приложении и, узнав о превосходном камне Reform, я ЖЕЛАЮ, что я использовал это. Похоже, что у вас уже есть этот код, который почти работает, но если вы будете больше работать с вложенными формами, я бы серьезно подумал о том, чтобы переключиться на этот камень. https://github.com/apotonick/reform – John