2014-03-25 199 views
0

以下代碼不起作用。它說undefined method 'table_name' for nil:NilClass如何從do塊訪問實例變量?

@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 

成員控制器

if params[:commit] == "Clear" 
     params[:q] = nil 
    end 

    respond_to do |format| 
     format.html 
     format.pdf do 
      pdf = MemberPdf.new(Member.search(params[:q]).result.order('name ASC'), view_context, Member.all.size) 
      send_data pdf.render, filename: "Members_List.pdf", type: "application/pdf", disposition: "inline" 
     end 
    end 
+0

也許你可以把初始文本放到控制檯上,而不是在你的PDF文件中使用'text',這可能會讓你看到你有多少成員。但是,我仍然無法看到'table_name'應該在哪裏定義。 '@ members'將會持有一個'Array',即使它不是'nil',它也不會回答你的'table_name'。也許你可以在'member_list_rows'中添加另一個'puts @ members.count'來幫助調試? – Patru

回答

3

正是由於@members是nil.You做錯了。

更改此

@members = Members.all #Wrong 

@members = Member.all #Right 

永遠記住,在型號名稱應該是奇異

這些被稱爲命名約定。欲瞭解更多信息,請閱讀這些風格指南(RubyRails

+0

對不起,它是一個錯誤的問題。在實際的代碼中,它的正確形式 – THpubs

+0

你可以發佈代碼片段所屬的完整代碼嗎? – Pavan

+0

我添加了完整的代碼 – THpubs

0

我不確定你在做什麼「table member_list_rows」。沒有得到。 在第三行,雖然,它應該是

if @members.table_name == "members" 
+0

仍然是一樣的錯誤 – THpubs

1

最有可能table方法不斷變化的環境,在其中您沒有訪問@members實例變量了。這很容易通過此示例代碼來實現:

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

@test_var = "test_var" 

do_stuff { puts @test_var } 

你將什麼也得不到,因爲@test_var不會在cls存在。

+0

讀[Prawn源代碼](https://github.com/prawnpdf/prawn/blob/master/lib/prawn/table.rb#L129-L143)看起來你是完全正確。 – toro2k