Ruby on rails 如何从do块访问实例变量?

Ruby on rails 如何从do块访问实例变量?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,以下代码不起作用。它表示nil:NilClass的未定义的方法“table\u name” @members = Members.all table member_list_rows do if @members.table_name == members row(0).background_color = '3498db' end end 完整代码 class MemberPdf < Prawn::Document def initialize(mem

以下代码不起作用。它表示nil:NilClass的
未定义的方法“table\u name”

@members = Members.all

table member_list_rows do      
  if @members.table_name == members
    row(0).background_color = '3498db'
  end
end
完整代码

class MemberPdf < Prawn::Document
  def initialize(members, view, allcount)
    super(top_margin: 50)
    if members.size != allcount
      @warn = " (Not all members)"
    else
      @all = " All"
    end
    text "Showing#{@all} #{members.size} Members", size: 18, style: :bold, align: :center, color: "636363"
    text "#{@warn}", size: 11, align: :center, color: "858585"
    @members = members
    @view = view
    member_list
  end

  def member_list
    move_down 20
    table member_list_rows do
      self.row(0).align = :center
      if @members.table_name == "members"
        row(0).background_color = '3498db'
      else

      end

      row(0).text_color = "FFFFFF"
      self.row_colors = ["DDDDDD", "FFFFFF"]
      self.header = true
      #self.cell.text_color = "B3B3B3"
      row(0).columns(0).style size: 20
    end
  end

  def member_list_rows
    [["Name", "Awardunit", "Address", "Contact", "Level of Entry", "Current Award", "Disabled?"  ]] +
    @members.map do |member|
      [member.name, member.awardunit.name, member.address, member.name, member.entrylvl, member.currentaward, @view.yesno(member.disabled)]
    end
  end
end

这是因为
@members
为零。您做错了

改变这个

@members = Members.all #Wrong

请始终记住,型号名称应为单数


这些称为命名约定。有关详细信息,请阅读这些样式指南(并且)

这是由于
@members
为零。您做错了

改变这个

@members = Members.all #Wrong

请始终记住,型号名称应为单数


这些称为命名约定。有关详细信息,请阅读这些样式指南(并且)

我不确定您正在对“表成员列表行”执行什么操作。我不明白。 但在第三行,它应该是

if @members.table_name == "members"

我不确定您正在对“表成员列表行”执行什么操作。我不明白。 但在第三行,它应该是

if @members.table_name == "members"

最有可能的
table
方法是更改上下文,在该上下文中,您不再有权访问
@members
实例变量。这可以通过以下示例代码轻松实现:

def do_stuff(&block)
  cls = Class.new
  cls.instance_eval(&block)
end

@test_var = "test_var"

do_stuff { puts @test_var }

您将不会收到任何结果,因为
@test\u var
cls

中不存在,很可能
表中的
方法正在更改上下文,您不再有权访问
@members
实例变量。这可以通过以下示例代码轻松实现:

def do_stuff(&block)
  cls = Class.new
  cls.instance_eval(&block)
end

@test_var = "test_var"

do_stuff { puts @test_var }

您将不会收到任何信息,因为
@test\u var
不存在于
cls

抱歉,这是问题中的一个错误。在实际代码中,您可以将完整代码发布到该代码段所属的位置吗?这一行@members=Member.all在哪里?在你的成员中?是的。然后它将成员传递给这个类。这段代码使用该数据呈现成员列表。成员数据将到达该类,我很确定,因为列表已呈现。@EApubs好的,您可以同时发布您的成员吗?对不起,这是问题中的一个错误。在实际代码中,您可以将完整代码发布到该代码段所属的位置吗?这一行@members=Member.all在哪里?在你的成员中?是的。然后它将成员传递给这个类。这段代码使用该数据呈现成员列表。成员数据将进入此类,我很确定,因为列表已呈现。@EApubs好的,您可以将您的成员发布到控制器吗?您可以
将初始文本放置到控制台,而不是在PDF文件中使用
text
,这样您可以查看您有多少成员。但是,我仍然看不到应该在哪里定义
表\u name
@members
将只持有一个
数组
,该数组不会响应您的
表名
,即使它不是
nil
。也许你可以添加另一个
put@members.count
member\u list\u行中来帮助调试?也许你可以
put
将初始文本放入控制台,而不是在PDF文件中使用
text
,这样可以让你看到你有多少成员。但是,我仍然看不到应该在哪里定义
表\u name
@members
将只持有一个
数组
,该数组不会响应您的
表名
,即使它不是
nil
。也许你可以添加另一个
put@members.count
member\u list\u rows
中来帮助调试?阅读似乎你是对的。阅读似乎你是对的。