【问题标题】:undefined method `each' for nil:NilClass when rendering from a different view从不同视图渲染时,nil:NilClass 的未定义方法“each”
【发布时间】:2015-08-06 16:01:53
【问题描述】:

每次我尝试渲染来自不同视图的东西时,我都会收到 NoMethodError: undefined method `each' for nil:NilClass。 当我将以下代码放入要渲染内容的视图中时,就会发生这种情况:

views/uploads/myuploads.html.erb

<%= render template: 'guitar_sounds/index' %>

它告诉我错误似乎在模板所在的特定代码块中:

views/guitar_sounds/index.html.erb

    <% @guitar_sounds.each do |sound| %> <!-- Error here -->
           <%= render "guitar_sound", sound:sound %>
    <% end %>

但是,当我自己加载该页面视图时,我没有收到任何错误。 有人可以帮我吗?

【问题讨论】:

  • 请添加这些文件的位置。

标签: ruby-on-rails ruby


【解决方案1】:

加载部分不会自动命中控制器方法。这样一来,听起来唯一正在运行的控制器方法是uploads#myuploads,但您的@guitar_sounds 变量是在guitar_sounds#index 中定义的。我只需在 UploadsController 中定义 @guitar_sounds 变量

UploadsController < ApplicationController
  def myuploads
    # here is where @guitar_sounds needs to be defined
    @guitar_sounds = GuitarSound.all
  end
end

假设您在很多方法中需要@guitar_sounds,您可以在before_action 中定义它

UploadsController < ApplicationController
  before_action :set_guitar_sounds
  def myuploads
    # normal controller code
  end

  private

  def set_guitar_sounds
    @guitar_sounds = GuitarSound.all
  end
end

现在@guitar_sounds 将为UploadsController 中的每个方法设置

【讨论】:

    【解决方案2】:

    您的模板 guitar_sounds/index 需要定义 @guitar_sounds,并且能够迭代其项目。

    如果你重用模板而不给@guitar_sounds分配任何值,默认情况下它将是nil,因此你可以看到错误。

    希望它能澄清一点问题!

    【讨论】:

      【解决方案3】:

      guitar_sounds/index 期望 @guitar_sounds 被定义,也就是,不是 nil,所以它可以迭代它的项目。

      您应该改为使用局部变量。

      <%= render template: 'guitar_sounds/index', guitar_sounds: @guitar_sounds %> #or other @ variable
      

      在你看来:

      <% guitar_sounds.each do |sound| %> 
             <%= render "guitar_sound", sound:sound %>
      <% end %>
      

      现在 guitar_sounds(注意缺少的 @)是您传递给渲染函数的局部变量!

      编辑:查看有关此问题的 rails 文档:Passing Local Variables to partials/templates

      【讨论】:

        猜你喜欢
        • 2012-08-27
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多