【问题标题】:NoMethodError in Welcome#index - Getting Started with RailsWelcome#index 中的 NoMethodError - Rails 入门
【发布时间】:2017-06-18 07:45:22
【问题描述】:

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

任何帮助将不胜感激!

【问题讨论】:

  • @articles 为零。向我们展示您的welcome_controller
  • 我会更新代码更新上面的代码。

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


【解决方案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 %>

【讨论】:

  • 补充:在迭代之前检查 index.html.erb 中的文章是否为 nil 很有用
  • 你太棒了@Pavan。现在一切正常!谢谢!
【解决方案2】:

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

您将根路由到“welcome#index”,即,当您点击http://localhost:300/ 时,您会从WelcomeController 调用方法index。我们习惯将其称为 WelcomeController 中的索引操作。

运行此方法后,它将(默认)渲染文件app/views/welcome/index.html.erb。看到图案了吗?动作名称与文件名相同,控制器名称与包含该文件的文件夹名称相同。

在此文件中,您使用的是 @articles。这是在WelcomeController#index 中定义的变量。

您的问题:这个变量没有在控制器中定义,导致一个 nil 对象。也就是说,它不存在。

解决方案:按照@Pavan 的建议定义此变量。

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

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

【讨论】:

    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多