每个都有嵌套资源的未定义方法

时间:2014-06-29 15:06:43

标签: ruby-on-rails undefined nested-resources

我试图关注Ryan Bates Polymorphic association教程,以便为我的网站添加一些评论。

问题是我有嵌套资源:

  #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 个答案:

答案 0 :(得分:1)

您的错误是undefined method each for nil:NilClass。你可以猜测你是在一个零对象上调用每个。这里你的@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>