В topics/_show_partial.html.erb
заменить
<% opinions = @topic.opinions %>
во второй строке
с
<% opinions = topic.opinions %>
Вы передаете переменную topic
через локальные данные в партиал, но вы вызываете instance variable @topic
, который не существует, когда вы вызываете метод create
Также измените следующее:
<%= render 'opinions/form', opinion: Opinion.new, typeOf: "pro", :topic => @topic %>
К
<%= render 'opinions/form', opinion: Opinion.new, typeOf: "pro", :topic => topic %>
и изменить
<%= render 'opinions/form', opinion: Opinion.new, typeOf: "con", :topic => @topic %>
К
<%= render 'opinions/form', opinion: Opinion.new, typeOf: "con", :topic => topic %>
Итак, ваш In topics/_show_partial.html.erb
должен выглядеть следующим образом:
<table class = "opinionlist" align="center">
<% opinions = topic.opinions %>
<% cons = opinions.select{|opinion| opinion.type_of == 'con'} %>
<% pros = opinions.select{|opinion| opinion.type_of == 'pro'} %>
<tr>
<% pros.each do |pro|%>
<td>
<div class="article-body">
<%= pro.content %>
</div>
<div class="article-meta-details">
<small>
Created by: <%= pro.user.username %>
<%= time_ago_in_words(pro.created_at) %> ago,
</small>
</div>
</td>
<% end %>
<% if pros.length < cons.length %>
<% difference = cons.length - pros.length%>
<% difference.times do %>
<%= content_tag(:td) %>
<% end %>
<% end %>
<td><%= render 'opinions/form', opinion: Opinion.new, typeOf: "pro", :topic => topic %></td>
</tr>
<tr>
<% cons.each do |con|%>
<td>
<div class="article-body">
<%= con.content %>
</div>
<div class="article-meta-details">
<small>
Created by: <%= con.user.username %>
<%= time_ago_in_words(con.created_at) %> ago,
</small>
</div>
</td>
<% end %>
<% if pros.length > cons.length %>
<% difference = pros.length - cons.length %>
<% puts "DIFFERENCE: " + difference.to_s %>
<% difference.times do %>
<%= content_tag(:td) %>
<% end %>
<% end %>
<td>
<%= render 'opinions/form', opinion: Opinion.new, typeOf: "con", :topic => topic %>
</td>
</tr>
</table>
Одна последняя вещь, которую вы можете принять за рекомендацию:
Вы строите много логики внутри своих представлений, например topics/_show_partial.html.erb
вы создаете много локальных переменных внутри представления. Я бы порекомендовал использовать другой подход, такой как построение всех ваших переменных в слое между ними перед представлением, например presenters
, посмотрите это обсуждение о rails presenters
Для чего нужна папка Rails Presenters?
Views
должен оставаться простым и свободным от логики, насколько это возможно