Неопределенный метод каждый с вложенными ресурсами
Я пытаюсь следовать учебнику по полиморфной ассоциации Райана Бейтса, чтобы оставить некоторые комментарии на моем сайте.
Дело в том, что у меня есть вложенные ресурсы:
#Nesting Resources
resources :users do
resources :photos do
resources :comments
resources :tags
end
end
Итак, я получаю ошибку в моем представлении (фотографии / шоу)
undefined method `each' for nil:NilClass
Я предполагаю, что проблема в моем контроллере, с комментариями, которые не определены правильно, но так как у меня есть вложенные ресурсы, я не знаю, как это сделать.
Контроллер Фотографий
def show
@photo = Photo.friendly.find(params[:id])
@user = @photo.user
@commentable = @photo
@comments = @commentable.comments
@comment = Comment.new
end
Новый Комментарий Частичный
<h2>Comments</h2>
<% if @comments.any? %>
<%= render "comments/comments" %>
<% else %>
Todavía no hay comentarios
<% if user_signed_in? %>
<%= render "comments/form" %>
<% end %>
<% end %>
Форма частичный (комментарии / форма)
<%= form_for [@commentable, @comment] do |f| %>
<% if @comment.errors.any? %>
<div class="error_messages">
<h2>Please correct the following errors.</h2>
<ul>
<% @comment.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.text_area :content, rows: 8 %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Комментарии частичные (комментарии / Комментарии)
<div id="comments">
<% @comments.each do |comment| %>
<div class="comment">
<%= simple_format comment.content %>
</div>
<% end %>
</div>
1 ответ:
Ваша ошибка говорит
undefined method each for nil:NilClass
. Как вы можете догадаться, вы вызываете каждый из объектов nil . Здесь Ваш@comments
равен нулю и, следовательно, доставляет вам неприятности.На ваш взгляд, попробуйте что-то вроде этого:
<div id="comments"> <% if @comments %> <% @comments.each do |comment| %> <div class="comment"> <%= simple_format comment.content %> </div> <% end %> <% end %> </div>
Правка:
Итак, если вы посмотрите на свой код, у вас есть @comments до Здесь :
<% if @comments.any? %> <%= render "comments/comments" %> <% else %> #do stuff <% end %>
именно после того, как вы позвоните своему частичному, ваш комментарий @будет потерян , поэтому попробуйте следующее:
<% if @comments.any? %> <%= render "comments/comments", comments: @comment %> <% else %> #do stuff <% end %>
А затем в вашем представлении используйте
<div id="comments"> <% comments.each do |comment| %> <div class="comment"> <%= simple_format comment.content %> </div> <% end %> </div>