Неопределенный метод, каждый с вложенными ресурсами

Я пытаюсь следовать учебнику по полиморфным ассоциациям Райана Бейтса, чтобы оставлять комментарии на своем сайте.

Дело в том, что у меня есть вложенные ресурсы:

  #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>

person Gibson    schedule 29.06.2014    source источник


Ответы (1)


Ваша ошибка говорит undefined method each for nil:NilClass. Как вы можете догадаться, вы вызываете each для нулевого объекта. Здесь ваш @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 %>

после того, как вы вызываете свой частичный комментарий, ваш @comment теряется, поэтому попробуйте следующее:

<% 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>
person Mandeep    schedule 29.06.2014
comment
спасибо за ответ. Это не сработает... Он продолжает говорить ‹%= form_for [@commentable, @comment] do |f| %›... Нужно ли где-то передавать в форму параметры user_id? Поскольку я имею дело с вложенными ресурсами - person Gibson; 29.06.2014
comment
@Gibson, да, вам нужно передать идентификатор пользователя в скрытом поле или использовать его в методе контроллера, и, кстати, это проблема формы, а не вашего представления :) - person Mandeep; 29.06.2014
comment
но проблема та же самая... Я все еще получаю ноль на объектах и ​​не знаю почему... - person Gibson; 29.06.2014
comment
Вы можете вставить свой файл полного просмотра? - person Mandeep; 29.06.2014
comment
Это не работает... Комментарии теряются в частичном new_comment, так что это означает, что комментарии равны нулю в Photo Controller, вот откуда возникает проблема... Но я не знаю, как с этим справиться! - person Gibson; 29.06.2014