Có print_r hoặc var_dump tương đương trong Ruby / Ruby on Rails không?


111

Tôi đang tìm cách kết xuất cấu trúc của một đối tượng, tương tự như các hàm PHP print_rvar_dumpvì lý do gỡ lỗi.

Câu trả lời:


133

Các .inspectphương pháp của bất kỳ đối tượng cần định dạng là một cách chính xác để trưng bày, chỉ cần làm ..

<%= theobject.inspect %>

Các .methodsphương pháp cũng có thể sử dụng:

<%= theobject.methods.inspect %>

Có thể hữu ích khi đưa điều đó vào <pre>thẻ, tùy thuộc vào dữ liệu


2
chỉ là một tiết kiệm thời gian cho những người tìm kiếm gọn gàng định dạng trong giao diện điều khiển:puts theobject.inspect.gsub(",", "\n")
Gus

65

Trong các lượt xem:

include DebugHelper

...your code...

debug(object)

Trong bộ điều khiển, kiểu máy và mã khác:

puts YAML::dump(object)

Nguồn


Debug (object) tăng phương pháp DebugHelper của không xác định 'DebugHelper của :)
Arnold Roa

8

Trong một chế độ xem, bạn có thể sử dụng chế độ <%= debug(yourobject) %>này sẽ tạo chế độ xem YAML cho dữ liệu của bạn. Nếu bạn muốn một cái gì đó trong nhật ký của bạn, bạn nên sử dụng logger.debug yourobject.inspect.


6

Bạn cũng có thể sử dụng YAML :: dump viết tắt ( y ) trong Rails console:

>> y User.first
--- !ruby/object:User 
attributes: 
  created_at: 2009-05-24 20:16:11.099441
  updated_at: 2009-05-26 22:46:29.501245
  current_login_ip: 127.0.0.1
  id: "1"
  current_login_at: 2009-05-24 20:20:46.627254
  login_count: "1"
  last_login_ip: 
  last_login_at: 
  login: admin
attributes_cache: {}

=> nil
>> 

Nếu bạn chỉ muốn xem trước một số nội dung chuỗi, hãy thử sử dụng tăng (ví dụ: trong các mô hình, bộ điều khiển hoặc một số nơi không thể truy cập khác). Bạn nhận được backtrace miễn phí :)

>> raise Rails.root
RuntimeError: /home/marcin/work/github/project1
    from (irb):17
>> 

Tôi cũng thực sự khuyến khích bạn thử ruby-debug :

Nó vô cùng hữu ích!


6

Bạn có thể sử dụng puts some_variable.inspect. Hoặc phiên bản ngắn hơn: p some_variable. Và để có kết quả đẹp hơn, bạn có thể sử dụng đá quý awesome_print .


3

Nếu bạn chỉ muốn dữ liệu có liên quan được hiển thị trên stdout (kết quả đầu cuối nếu bạn đang chạy từ dòng lệnh), bạn có thể sử dụng p some_object.


3

Câu trả lời rõ ràng là rất tốt nhưng nếu bạn không muốn sử dụng bảng điều khiển (thiết bị đầu cuối), trong Rails, bạn có thể in kết quả trong Chế độ xem bằng cách sử dụng Trình trợ giúp của gỡ lỗi 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

kết quả (trong trình duyệt)

- !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

Tôi sử dụng cái này :)

require 'yaml'

module AppHelpers
  module Debug
    module VarDump

      class << self

        def dump(dump_object, file_path)
          File.open file_path, "a+" do |log_file|
            current_date = Time.new.to_s + "\n" + YAML::dump(dump_object) + "\n"
            log_file.puts current_date
            log_file.close
          end
        end

      end

    end
  end
end

0

Gần đây, tôi đang sử dụng phương pháp awesome_print 's aphoạt động trên bảng điều khiển cũng như trong các khung nhìn.

Đầu ra có màu cụ thể cho từng loại thực sự tạo ra sự khác biệt nếu bạn cần quét trực quan Stringhoặc Numericđối tượng (Mặc dù tôi đã phải chỉnh sửa biểu định kiểu của mình một chút để có được giao diện bóng bẩy)


0

Gần đây, tôi đã trở thành một fan hâm mộ của PRY , tôi thấy nó vô cùng tuyệt vời khi làm những việc như kiểm tra các biến, gỡ lỗi mã đang chạy và kiểm tra mã bên ngoài. Đó có thể là một câu trả lời cho câu hỏi cụ thể này hơi quá mức cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.