Rails - 为什么我为nil获取未定义的方法`name':NilClass

时间:2016-04-26 10:38:59

标签: ruby-on-rails ruby

我按类别显示问题,每个问题都有自己的编号。我这样做了(index.html.erb):

<% @categories.each do |category| %>
     <div id=<%= "box#{category.id}" -%>>
        <h1><%= category.name %></h1>
        <% category.questions.each_with_index do |question, i| %>
            <ul class="question-list" style="display: inline;">
                <li><%= link_to (i + 1), show_path %></li>
            </ul>
        <% end %>
     </div>
<% end %>

当我点击问题编号时,我想像这样显示它(show.html.erb):

<div class="question-wrapper">
       <h1><%= @category.name %></h1>
       <div class="image left-align">
         <%= question_image_tag(question, :large) %>
       </div>
       <div class="question-text right-align">
        <%= @question.question_name %>
       </div>
       <p><%= @question.answer %></p>
 </div>

这是我的控制者:

def index
    @categories = Category.all
    @questions = Question.all
end

def show
    @categories = Category.all
    @questions = Question.all
end

现在,我正在为nil获取未定义的方法`name':NilClass(也为show.html.erb中的所有方法抛出错误),我无法解决它。

问题:如何解决nil的未定义方法`name':NilClass?

更新: - 堆栈跟踪

  

NoMethodError - 未定义的方法category' for nil:NilClass: app/controllers/quizz_controller.rb:13:in显示'

的routes.rb

Rails.application.routes.draw do
    mount Attachinary::Engine => "/attachinary"
    root to: "quizz#home"
    %w(quizz
       show).each do |page|
       get page, to: "quizz##{page}", as: page
    end
    resources :categories
    resources questions
end

4 个答案:

答案 0 :(得分:4)

你在开玩笑。

def index
    @categories = Category.all
    @questions = Question.all
end

def show
    @category = Category.find(id-of-category)
    @question = Question.find(id-of-question)
end

当您调用索引方法时,这意味着您需要向用户显示所有问题和类别。

但是当您需要显示特定问题或显示方法时,您需要找到特定问题和类别。

在你的show.html.erb中你已经使用了像@category和@question这样的实例变量,你能告诉我你在视图上定义它的位置。

@ Unknown19用户,我想建议你一个想到的就是,你只是阅读有关Scaffold并尝试使用Scaffold实现单个模型我相信你会学到很多东西以及你应该如何编写方法及其实例,这是学习Restful机制的最佳方式。

答案 1 :(得分:3)

您只需要使用 params 传递问题ID ,然后在 show action中的问题ID中找到 @question 你的控制器。

您的各自观点和控制器代码应如下所示:

<强> index.html.erb

<% @categories.each do |category| %>
 <div id=<%= "box#{category.id}" -%>>
    <h1><%= category.name %></h1>
    <% category.questions.each_with_index do |question, i| %>
        <ul class="question-list" style="display: inline;">
            <li><%= link_to (i + 1), show_path(question_id: question.id) %></li>
        </ul>
    <% end %>
 </div>

<强>控制器

def show
  @question = Question.find_by_id(params[:question_id])
  @category = @question.category
end

<强> show.html.erb

<div class="question-wrapper">
   <h1><%= @category.name %></h1>
   <div class="image left-align">
     <%= question_image_tag(question, :large) %>
   </div>
   <div class="question-text right-align">
    <%= @question.question_name %>
   </div>
   <p><%= @question.answer %></p>
</div>

答案 2 :(得分:0)

单击问题编号并将show method的代码更改为

时,只需发送category_id和question_id即可
def show 
  @category = Category.find(params[:category_id])
  @question = Question.find(params[:question_id])
end

并更改index.html.erb表单

<li><%= link_to (i + 1), show_path %></li>

<li><%= link_to (i + 1), show_path(category_id: category.id, question_id: question.id) %></li>

答案 3 :(得分:0)

传递类别ID&amp;如下所示的问题ID:

<li><%= link_to (i + 1), question(category_id: category.id, question_id: question.id) %></li>

在控制器中写下以下内容:

def show 
  @category = Category.find(params[:category_id])
  @question = Question.find(params[:question_id])
end