【问题标题】:Adding Categories to Getting Started with Rails tutorial, get "undefined method `each' for nil:NilClass"将类别添加到 Rails 入门教程,获取“nil:NilClass 的未定义方法 `each'”
【发布时间】:2014-07-30 15:03:49
【问题描述】:

我遵循了 Rails 入门教程,创建了文章和 cmets MVC,并希望将类别标签添加到我的应用程序中。我重复了教程中的步骤(创建 cmets)并启动并运行了类别(可以通过articles/show.html.erb 创建和查看类别)。但是,当我尝试添加部分以查看已创建的所有类别并在主页(articles/index.html.erb)上使用部分时,我收到以下错误

Showing /Users/szymonborucki/ruby_apps/workspace/newspaper/app/views/articles/_sidebar_categories.html.erb where line #2 raised:

undefined method `each' for nil:NilClass
Extracted source (around line #2):

  <h2>Browse by categories: </h2>
  <% @categories.each do |c| %>
    <p><%= c.category %></p>
  <% end %>

这里是部分(_sidebar_categories.html.erb)

 <h2>Browse by categories: </h2>
    <% @categories.each do |c| %>
      <p><%= c.category %></p>
    <% end %>

categories_controller.rb

class CategoriesController < ApplicationController

  def index
    @categories = Category.all   
  end

  def create
    @article = Article.find(params[:article_id])
    @category = @article.categories.create(category_params)
    redirect_to article_path(@article)
  end

   def destroy
    @article = Article.find(params[:article_id])
    @category = @article.categories.find(params[:id])
    @category.destroy
    redirect_to article_path(@article)
  end
  private
    def category_params
      params.require(:category).permit(:category)
    end
end

Category.rb 模型

class Category < ActiveRecord::Base
  belongs_to :article
end

文章 index.html.erb

<div class="container">
<h1>Listing articles</h1>


    <% @articles.each do |article| %>
      <div class="row">
        <div class="col-sm-8">
          <h2><%= article.title %></h2> 
        </div>
      </div> <!-- .row -->

      <div class="row">
        <div class="col-sm-8">
          <p><%= article.content %></p> 
        </div>
      </div> <!-- .row -->

      <div class="row">
        <div class="col-sm-8">
          <!-- <ul class="list-unstyled"> -->
            <button type="button" class="btn btn-primary btn-lg"><%= link_to 'Show', article %></button>
            <button type="button" class="btn btn-success btn-lg"><%= link_to 'Edit', edit_article_path(article) %></button>
            <button type="button" class="btn btn-danger btn-lg"><%= link_to 'Delete', article, method: :delete, data: { confirm: 'Are you sure?' } %></button>

        </div>
      </div> <!-- .row -->

    <% end %>
    </div> <!-- .container -->

<% content_for :aside do %>
  <%= render 'sidebar_popular' %>
  **<%= render 'sidebar_categories' %>**
<% end %>

我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    当您在/articles 中时,它正在访问ArticlesController

    要么在那里定义@categories,要么在你的ApplicationController中定义before_filter

    【讨论】:

    • 工作就像一个魅力!谢谢
    【解决方案2】:

    由于您没有为您的类别使用任何命名范围(或任何其他过滤器),我想您的场景最简单的解决方案就是更改您的部分,这个:

    <% @categories.each do |c| %>
    

    到那个:

    <% Category.all.each do |c| %>
    

    正如Baloo 指出的那样,为了使用实例变量(例如@category)或集合(例如@categories),您必须首先在控制器(在本例中为articles_controller)或视图本身中定义它们(不太像 Rails,但它确实有效)

    【讨论】:

    • 工作就像一个魅力!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多