나는 PHP에 상응하는 print_r()
(인간이 읽을 수있는 인쇄); 현재 원시 출력은 다음과 같습니다.
ActiveRecord::Relation:0x10355d1c0
어떻게해야합니까?
나는 PHP에 상응하는 print_r()
(인간이 읽을 수있는 인쇄); 현재 원시 출력은 다음과 같습니다.
ActiveRecord::Relation:0x10355d1c0
어떻게해야합니까?
답변:
나는 일반적으로 먼저 시도 .inspect
합니다 .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
도움이 되었기를 바랍니다.
y record_name.attributes
. #y
의 별칭입니다 to_yaml
.
모델에서 to_s 메소드를 정의하십시오. 예를 들면
class Person < ActiveRecord::Base
def to_s
"Name:#{self.name} Age:#{self.age} Weight: #{self.weight}"
end
end
그런 다음 #puts로 인쇄하면 해당 변수와 함께 해당 문자열이 표시됩니다.
puts my_model_instance
전화하지 않습니다 to_s
. 다음과 같이 명시 적으로 수행해야합니다.puts my_model_instance.to_s
Rails에서는 디버그 도우미 ActionView :: Helpers :: DebugHelper 를 사용하여 View에 결과를 인쇄 할 수 있습니다.
#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
결과 (브라우저에서)
- !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
.inspect
당신이 찾고있는 것입니다 .to_yaml
. IMO보다 훨씬 쉽습니다 !
user = User.new
user.name = "will"
user.email = "will@example.com"
user.inspect
#<name: "will", email: "will@example.com">
inspect
훌륭하지만 때로는 충분하지 않습니다. 예를 들어 다음 BigDecimal
과 같이 인쇄 #<BigDecimal:7ff49f5478b0,'0.1E2',9(18)>
됩니다..
인쇄되는 내용을 완전히 제어하려면 재정의 to_s
하거나 inspect
방법 을 사용할 수 있습니다. 또는 미래의 개발자를 너무 혼동하지 않도록 자신의 것을 만드십시오.
class Something < ApplicationRecord
def to_s
attributes.map{ |k, v| { k => v.to_s } }.inject(:merge)
end
end
이렇게하면 to_s
모든 속성에 메서드 (예 :)가 적용됩니다 . 이 예제는 추악한 BigDecimals
.
소수의 속성 만 재정의 할 수도 있습니다.
def to_s
attributes.merge({ my_attribute: my_attribute.to_s })
end
두 가지를 혼합하여 만들거나 어떻게 든 연결을 추가 할 수도 있습니다 .
pp도 작업을 수행하므로 gem이 필요하지 않습니다.
@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)>,
개체의 두 인스턴스를 인쇄 할 수도 있습니다.
pp( Accrual.first , Accrual.second)
`
`
`
을 사용해야 debug(@var)
합니다. 정확히 "print_r"과 같습니다.