How do I print out the contents of an object in Rails for easy debugging?

前端 未结 8 1138
感情败类
感情败类 2020-12-04 18:32

I think I\'m trying to get the PHP equivalent of print_r() (print human-readable); at present the raw output is:

ActiveRecord::Relation:0x10355d         


        
相关标签:
8条回答
  • 2020-12-04 19:06

    I'm using the awesome_print gem

    So you just have to type :

    ap @var
    
    0 讨论(0)
  • 2020-12-04 19:09

    You need to use debug(@var). It's exactly like "print_r".

    0 讨论(0)
  • 2020-12-04 19:13

    define the to_s method in your model. For example

    class Person < ActiveRecord::Base
      def to_s
        "Name:#{self.name} Age:#{self.age} Weight: #{self.weight}"
      end
    end
    

    Then when you go to print it with #puts it will display that string with those variables.

    0 讨论(0)
  • 2020-12-04 19:15

    In Rails you can print the result in the View by using the debug' Helper ActionView::Helpers::DebugHelper

    #app/view/controllers/post_controller.rb
    def index
     @posts = Post.all
    end
    
    #app/view/posts/index.html.erb
    <%= debug(@posts) %>
    
    #start your server
    rails -s
    

    results (in browser)

    - !ruby/object:Post
      raw_attributes:
        id: 2
        title: My Second Post
        body: Welcome!  This is another example post
        published_at: '2015-10-19 23:00:43.469520'
        created_at: '2015-10-20 00:00:43.470739'
        updated_at: '2015-10-20 00:00:43.470739'
      attributes: !ruby/object:ActiveRecord::AttributeSet
        attributes: !ruby/object:ActiveRecord::LazyAttributeHash
          types: &5
            id: &2 !ruby/object:ActiveRecord::Type::Integer
              precision: 
              scale: 
              limit: 
              range: !ruby/range
                begin: -2147483648
                end: 2147483648
                excl: true
            title: &3 !ruby/object:ActiveRecord::Type::String
              precision: 
              scale: 
              limit: 
            body: &4 !ruby/object:ActiveRecord::Type::Text
              precision: 
              scale: 
              limit: 
            published_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
              subtype: &1 !ruby/object:ActiveRecord::Type::DateTime
                precision: 
                scale: 
                limit: 
            created_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
              subtype: *1
            updated_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
              subtype: *1
    
    0 讨论(0)
  • 2020-12-04 19:19

    I generally first try .inspect, if that doesn't give me what I want, I'll switch to .to_yaml.

    class User
      attr_accessor :name, :age
    end
    
    user = User.new
    user.name = "John Smith"
    user.age = 30
    
    puts user.inspect
    #=> #<User:0x423270c @name="John Smith", @age=30>
    puts user.to_yaml
    #=> --- !ruby/object:User
    #=> age: 30
    #=> name: John Smith
    

    Hope that helps.

    0 讨论(0)
  • 2020-12-04 19:19

    pp does the job too, no gem requiring is required.

    @a = Accrual.first ; pp @a
    
    #<Accrual:0x007ff521e5ba50
     id: 4,
     year: 2018,
     Jan: #<BigDecimal:7ff521e58f08,'0.11E2',9(27)>,
     Feb: #<BigDecimal:7ff521e585d0,'0.88E2',9(27)>,
     Mar: #<BigDecimal:7ff521e58030,'0.0',9(27)>,
     Apr: #<BigDecimal:7ff521e53698,'0.88E2',9(27)>,
     May: #<BigDecimal:7ff521e52fb8,'0.8E1',9(27)>,
     June: #<BigDecimal:7ff521e52900,'0.8E1',9(27)>,
     July: #<BigDecimal:7ff521e51ff0,'0.8E1',9(27)>,
     Aug: #<BigDecimal:7ff521e51bb8,'0.88E2',9(27)>,
     Sep: #<BigDecimal:7ff521e512f8,'0.88E2',9(27)>,
     Oct: #<BigDecimal:7ff521e506c8,'0.0',9(27)>,
     Nov: #<BigDecimal:7ff521e43d38,'0.888E3',9(27)>,
     Dec: #<BigDecimal:7ff521e43478,'0.0',9(27)>,
    

    You can also print two instances of an object:

     pp( Accrual.first , Accrual.second)
    `
    `
    `
    
    0 讨论(0)
提交回复
热议问题