错误:未定义的方法`name'为零:NilClass

时间:2017-05-09 04:28:38

标签: ruby-on-rails

我是Rails的新手并且一直关注在线教程,其中涉及创建一个简单的博客站点。我正处于为控制器和模型添加测试的项目中。当我尝试运行posts_controller_test.rb时,出现以下错误:

Error:
PostsControllerTest#test_should_get_index:
ActionView::Template::Error: undefined method `name' for nil:NilClass
    app/views/posts/index.html.erb:7:in `block in _app_views_posts_index_html_erb__805998677_54338856'
    app/views/posts/index.html.erb:1:in `_app_views_posts_index_html_erb__805998677_54338856'
    test/controllers/posts_controller_test.rb:5:in `block in <class:PostsControllerTest>'

bin/rails test test/controllers/posts_controller_test.rb:4

这是我的posts_controller_test.rb:

class PostsControllerTest < ActionDispatch::IntegrationTest
  test "should get index" do
    get posts_url
    assert_response :success
    assert_not_nil assigns(:posts)  
  end
end

本教程是在早期版本的rails上生成的,它使用了get:index,我读过它在rails 5中已弃用,建议使用URL而不是action name。

有趣的是,如果我执行控制器home_controller_test.rb(我甚至没有修改过),我会在下面得到一个不同的错误:

Error:
HomeControllerTest#test_should_get_index:
NameError: undefined local variable or method `home_index_url' for #<HomeControllerTest:0x67df790>
    test/controllers/home_controller_test.rb:5:in `block in <class:HomeControllerTest>'

bin/rails test test/controllers/home_controller_test.rb:4

这是home_controller_test.rb:

require 'test_helper'

class HomeControllerTest < ActionDispatch::IntegrationTest
  test "should get index" do
    get home_index_url
    assert_response :success
  end
end

对于可能出现的问题的任何帮助将不胜感激。

添加帖子索引视图:

<% @posts.each do |post| %>
    <div class="post">
        <h2 class="title"><%= link_to post[:title],post %></h2>
        <div class="entry"><%= post[:body] %></div>
        </br>
        <div class="byline">
            <span class="meta"><%= post[:created_at].strftime("%b %d, %Y") %> Posted By: <%= post.admin_user.name %></span><span class="links"><%= link_to "Read More",post %>
        </div>
    </div>
<% end %>

1 个答案:

答案 0 :(得分:0)

更新(2017年5月10日)

您的帖子模型的admin_user_id主要是指Post属于AdminUser。

您的开发rails应用程序不会触发错误,因为它始终为每个帖子链接AdminUser。但是在测试环境中,您需要在test / fixtures文件夹下设置数据库数据。

在您的情况下,您需要在test / fixtures / admin_users.yml下创建一个AdminUser(例如adminUserOne),并将您的帖子与AdminUser相关联,如

postOne:
  admin_user: adminUserOne

然后只有你的帖子链接了admin_user。

对于良好的做法,如果admin_user不存在,可能只是检查AdminUser的存在并提供不同的输出

<%= post.admin_user.present? post.admin_user.name : '-' %>

第一次出错

  

未定义的方法`name&#39;为零:NilClass

     

应用程序/视图/帖/ index.html.erb:7

错误消息指示错误位于上述视图文件的第7行。在引用您的视图文件内容后,它是由

引起的
post.admin_user.name

在Post模型下,它与admin_user没有任何关系。 通常我们可以检查db / schema.rb中的关系或使用沙箱模式运行rails控制台

rails c --sandbox

然后尝试做类似

的事情
Post.first.admin_user

观察控制台中会给出什么结果。

对于第二个错误,

home_index_url不是rails应用程序中的有效网址。

在rails 5中,您可以使用命令

rails routes -c home

找到任何相关路线。在我的申请中,我有这个结果

  

前缀

     

信息中心

     

所以我有dashboard_url和root_url。因此,在您的情况下,应该有前缀为home_index的路由,然后只能使用 home_index_url