【问题标题】:ActionView::Template::Error (undefined method `each' for nil:NilClass):?ActionView::Template::Error(nil:NilClass 的未定义方法“每个”):?
【发布时间】:2020-05-14 13:07:31
【问题描述】:

我的 ruby​​ on rails 项目中有一个服务模型,但我无法在我的项目的 pages#home 视图中呈现它我得到了这个 undefined method `each' for nil:NilClass 虽然我已经在我的 Servicecontroller 中定义了变量-

我的 ServicesController 文件-

class ServicesController < ApplicationController
  def show
    @services = Service.all
  end
end

我的节目文件-

<div class="container">

  <h3>Services we offer-</h3>
  <% @services.each do |service| %>
        <h5><%= service.name %></h5>
        <p><%= service.description %></p>
  <% end %>
</div>

我的服务视图的显示文件的路径是这个-app\views\services\_show.html.erb,我在我的页面视图中将它渲染为app\views\pages\home.html.erb&lt;%= render 'services/show' %&gt;,尽管我能够使用 @services=Service.all 命令查看 rails 控制台中的所有服务。

有人可以帮帮我吗?

【问题讨论】:

  • 如果你想在PagesController#home处理请求时设置实例变量@services = Service.all,你需要在that方法中实际设置实例变量。在另一个控制器中设置实例变量绝对没有任何作用。 Rails 中的show 显示一条记录。 index 对应记录的集合。
  • 谢谢它成功了,我在我的 pagesconroller 中移动了 @services=Service.all 并且它成功了。谢谢

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

您在错误的控制器和操作中设置了变量。

如果您希望@services 实例变量在home.html.erb 视图中可用,则需要在PagesController#home 中设置该数据。

如果您在正确的操作中设置变量,然后在 home 视图中呈现部分内容,无论是 _show 或其他视图,您将能够访问该变量。

尝试类似:

class PagesController < ApplicationController
  ...

  def home
    @services = Service.all
  end
end

【讨论】:

  • 谢谢,我还有一个问题,如果我不想将我的节目文件命名为 '_show.html.erb' 而我希望它是 'show.html.erb'那么如何渲染呢?
  • 如果这是一个部分(视图的一部分将在另一个视图中呈现),这是一个约定,您将其命名为以_ 开头。在这种情况下,将其称为 show 可能不是一个好主意,因为这是 ServicesController#show 操作在尝试呈现其关联视图时将搜索的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多