Pertanyaan Bagaimana cara mencetak isi objek di Rails untuk memudahkan debugging?


Saya pikir saya mencoba untuk mendapatkan setara dengan PHP print_r() (cetak yang bisa dibaca manusia); saat ini output mentahnya adalah:

ActiveRecord::Relation:0x10355d1c0

Apa yang harus saya lakukan?


75
2018-01-28 15:27


asal


Jawaban:


Saya biasanya pertama kali mencoba .inspect, jika itu tidak memberi saya apa yang saya inginkan, saya akan beralih ke .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

Semoga itu membantu.


170
2018-01-28 15:43



tentukan metode to_s dalam model Anda. Sebagai contoh

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

Kemudian ketika Anda pergi untuk mencetaknya dengan #put akan menampilkan string tersebut dengan variabel-variabel tersebut.


8
2018-01-28 15:33



Di Rails Anda dapat mencetak hasilnya di View dengan menggunakan 'Pembantu' debug 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

hasil (di 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

4
2017-10-20 05:08



Saya menggunakan permata awesome_print

Jadi Anda hanya perlu mengetik:

ap @var

3
2018-02-04 14:52



inspect itu bagus tapi terkadang tidak cukup baik. Misalnya. BigDecimal cetakan seperti ini: #<BigDecimal:7ff49f5478b0,'0.1E2',9(18)>.

Untuk memiliki kontrol penuh atas apa yang dicetak, Anda dapat mendefinisikan kembali to_s atau inspect metode. Atau buat yang Anda sendiri untuk tidak membingungkan devs masa depan terlalu banyak.

  class Something < ApplicationRecord

    def to_s
      attributes.map{ |k, v| { k => v.to_s } }.inject(:merge)
    end

  end

Ini akan menerapkan metode (mis. to_s) ke semua atribut. Contoh ini akan menyingkirkan yang jelek BigDecimals.

Anda juga dapat mendefinisikan hanya beberapa atribut saja:

  def to_s
    attributes.merge({ my_attribute: my_attribute.to_s })
  end

Anda juga dapat membuat campuran dari keduanya atau entah bagaimana tambahkan asosiasi.


1
2018-02-09 18:44



.inspect adalah apa yang Anda cari, itu cara IMO lebih mudah daripada .to_yaml!

user = User.new
user.name = "will"
user.email = "will@example.com"

user.inspect
#<name: "will", email: "will@example.com">

0
2018-06-14 21:03



Anda perlu menggunakan debug(@var). Ini persis seperti "print_r".


-3
2018-01-28 15:52