Welcome #index中的NoMethodError - Rails入门

时间:2017-06-18 07:45:22

标签: ruby-on-rails model-view-controller crud

Screenshot Photo

需要此错误的帮助。我无法弄清楚代码有什么问题。我在网上做了相关主题的研究,但我找不到任何解决方案。以下是代码。

<!-- index.html.erb -->

<h1>Hello, Rails!</h1>
<%= link_to 'My Blog', controller: 'articles' %>
<%= link_to 'New article', new_article_path %>

<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
  </tr>

  <% @articles.each do |article| %>
    <tr>
      <td><%= article.title %></td>
      <td><%= article.text %></td>
      <td><%= link_to 'Show', article_path(article) %></td>
      <td><%= link_to 'Edit', edit_article_path(article) %></td>
      <td><%= link_to 'Destroy', article_path(article),
              method: :delete,
              data: { confirm: 'Are you sure?' } %></td>
    </tr>
  <% end %>
</table>

这是来自控制器的代码。

# welcome_controller.rb
class WelcomeController < ApplicationController
  def index
  end
end

配置代码

# routes.rb
Rails.application.routes.draw do
  get 'welcome/index'
  resources :articles
  root 'welcome#index'
end

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

  

每个未定义的方法为nil:NilClass

错误归因于@articlesnil。您应该在welcome#index

中定义它
class WelcomeController < ApplicationController 
  def index
    @articles = Article.all
  end 
end

但是,您可以调整index.html.erb以避免此类错误

<% unless @articles.blank? %>
  <% @articles.each do |article| %>
    <tr>
      <td><%= article.title %></td>
      <td><%= article.text %></td>
      <td><%= link_to 'Show', article_path(article) %></td>
      <td><%= link_to 'Edit', edit_article_path(article) %></td>
      <td><%= link_to 'Destroy', article_path(article), method: :delete, data: { confirm: 'Are you sure?' } %></td>
    </tr>
  <% end %>
<% end %>

答案 1 :(得分:0)

@ Pavan的回答是正确的,将解决您的问题!当你开始时,我决定写下这个答案来解释发生了什么:

您已将根路由到#欢迎#index&#39;,即当您点击http://localhost:300/时,您从pip install django-bootstrap3 调用方法index。我们习惯于从WelcomeController调用它的索引操作。

运行此方法后,它将(默认情况下)呈现文件WelcomeController。看模式?操作名称与文件名相同,控制器名称与包含此文件的文件夹名称相同。

在此文件中,您使用的是app/views/welcome/index.html.erb。这是在@articles中定义的变量。

您的问题:此变量未在控制器中定义,从而产生一个零对象。即,它不存在。

解决方案:将此变量定义为@Pavan建议。

但是你可能会再次陷入同样的​​例外:如果你没有保存文章。为了防止这种情况,你只需要检查@articles是否为零,正如@Pavan所建议的那样。

希望这个答案能够澄清问题以及解决问题的建议!