সহজ ডিবাগিংয়ের জন্য আমি কীভাবে রেলগুলিতে কোনও সামগ্রীর সামগ্রী মুদ্রণ করব?


102

আমার মনে হয় আমি পিএইচপি সমান print_r()(মানব-পঠনযোগ্য মুদ্রণযোগ্য) পাওয়ার চেষ্টা করছি ; বর্তমানে কাঁচা আউটপুটটি হ'ল:

ActiveRecord::Relation:0x10355d1c0

আমার কি করা উচিৎ?


আপনি যদি এটি না দেখে থাকেন (যেহেতু আপনি আমার আগে পোস্ট করা উত্তর গ্রহণ করেছেন), ডিবাগ () ফাংশনটি পিএইচপি-তে ঠিক প্রিন্ট_আর () এর মতো কাজ করে ।
অ্যান্ড্রু

4
ডিবাগ () এর পরে এই পৃষ্ঠায় যে কেউ আসছেন কেবল তার ফাংশন হিসাবে অন্তর্ভুক্ত না করে পুরানো। কাজ হবে না। ( পৃষ্ঠার আরও নিচে এটি দেখানোর জন্য ক্রেডিট স্ট্যাকওভারফ্লো.com/users/231309/irongaze-com ।)
0112

উত্তর:


215

আমি সাধারণত প্রথমে চেষ্টা করি .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

আশা করি এইটি কাজ করবে.


6
আমি খুঁজে পেয়েছি যে কিছু YAML রেকর্ডগুলির আউটপুটগুলি আমার দেখা যত্নের চেয়ে আরও বেশি ডেটা (মেটাডেটা, সম্ভবত?) প্রদর্শন করে। যদি আমি কোনও রেকর্ডের YAML সংস্করণটি সন্ধান করি তবে আমি ব্যবহার করব y record_name.attributes#yজন্য একটি উপনাম to_yaml
তাস

9

আপনার মডেলটিতে to_s পদ্ধতিটি সংজ্ঞায়িত করুন। উদাহরণ স্বরূপ

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

তারপরে আপনি যখন এটি # মুখ্যগুলি দিয়ে মুদ্রণ করতে যান তখন সেই স্ট্রিংটি সেই পরিবর্তনশীলগুলির সাথে প্রদর্শিত হবে।


আপনি যদি জানেন না যে এর মধ্যে থাকা ভেরিয়েবলগুলি কী?
cjm2671

আপনি আরো নির্দিষ্ট হতে পারে? আপনি কি বলছেন, যদি একটি ভেরিয়েবল একটি অ্যারে বা হ্যাশ হয়? তাদের # টো_সরা এটির যত্ন নেবে।
ক্রিস লেদেট

এটি সঠিকভাবে বানানো হয় না। puts my_model_instanceকল করবে না to_s। আপনাকে স্পষ্টভাবে এটি করতে হবে:puts my_model_instance.to_s
thisismydesign

6

কারাগারে আপনি ' ডিবেগ হেল্পার অ্যাকশনভিউ :: সহায়ক' :: ডিবাগহেল্পার ব্যবহার করে ভিউতে ফলাফল মুদ্রণ করতে পারেন

#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

6

আমি দুর্দান্ত_প্রিন্ট রত্ন ব্যবহার করছি

সুতরাং আপনাকে কেবল টাইপ করতে হবে:

ap @var

4
আমি এত সাধারণ কোনও কিছুর জন্য রত্ন ইনস্টল করার পক্ষে পরামর্শক নই, তবে আমি নিয়মিত অসাধারণ প্রিন্ট ব্যবহার করি।
তাস

এটি সত্যিই ভাল, অবশেষে আমি আমার কোডটিতে যা করেছি তা হ'ল: রেলস.লগার.এপ সামান্য অবজেক্ট
আলেকসান্দার

জহর ইনস্টল করুন দুর্দান্ত_প্রিন্ট (জেমফাইলে কোনও সম্পাদনার দরকার নেই)
জয়


3

পিপিও কাজটি করে, কোনও রত্নের প্রয়োজন হয় না।

@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)
`
`
`

2

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

আপনি দুটি বা কোনওভাবে সংযুক্তিগুলির মিশ্রণ তৈরি করতে পারেন ।


-3

আপনার ব্যবহার করা দরকার debug(@var)। এটি হ'ল "মুদ্রণ_আর" এর মতো।


5
এটি কোনও জিনিস নয়, কমপক্ষে রুবি ১.৯.x এ - নোমথোডেরর: মূল জন্য অপরিজ্ঞাত পদ্ধতি `ডিবাগ: অবজেক্ট
ইরংজে ডটকম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.