2011-04-05 3 views
1

J'utilise une méthode de bloc pour imprimer une liste, mais elle génère une erreur.méthodes de bloc dans ruby ​​

class MyDataListBuilder 
    attr_accessor :object 

    def initialize(object) 
     @object = object 
    end 

    def column (&block) 
     content_tag :li, block.call 
    end 
    end 

et l'utiliser comme

<%= my_data_list_for @leads, [" :10", "Age:30", "Contact:140", "Phone:140", "Email:180", "Company:100", ""] do |l| %> 
     <%= l.column do %> 
      <%= object.age %> 
     <% end %> 
    <% end %> 

autres méthodes sont

def list_headers(args=[]) 
    args = Array.new(args) 
    columns = [] 
    args.map { |o| columns << content_tag(:li, o.split(":").first, :style=>"width:#{o.split(":").second}px;") } 
    content_tag(:ul, columns.join(" ").html_safe, :class=>"list-headers") 
    end 

    def my_data_list_for(object, headers=[], &block) 
    arr = [] 
    object.each do |o| 
     arr = capture(DataListHelper::MyDataListBuilder.new(o), &block) 
    end 
    content_tag(:ol, list_headers(headers) + arr, :class=>"data-list") 
    end 

il génère une erreur et je ne peux pas comprendre pourquoi:

ActionView::Template::Error (undefined local variable or method `object' for #<#<Class:0xcaa1ca0>:0xca9ebf4>): 

S'il vous plaît aider moi dedans.

Répondre

1

Cela résout le problème.

class MyDataListBuilder 
    include ActionView::Helpers::TagHelper 
    include ActionView::Helpers::CaptureHelper 
    attr_accessor :object, :output_buffer 

    def initialize(object) 
     @object  = object 
     @output_buffer = nil 
    end 

    def column (&block) 
     if block_given? 
     content_tag(:li, capture(self, &block)) 
     else 
     content_tag(:li, "") 
     end 
    end 
    end