如何在 rails 控制台中将控制器打印为文本?

How to print a controller as text in the rails console?

我想查看 Devise::RegistrationsController(出于好奇,我将继承它 here

我尝试了明显的 rails c 然后 puts Devise::RegistrationsController 和一些变体(例如 .to_s)但没有运气..

是否可以在某处查看,我可以将其打印到 rails 控制台进行查看吗?

Pry IRB 的替代控制台内置了源代码浏览。

安装 pry-rails gem 并使用 rails c 启动控制台,它将启动 Pry 而不是 IRB。

然后您可以使用 show-source 从控制台直接查看 gem 的源代码:

max@pop-os ~/p/sandbox> rails c
Running via Spring preloader in process 29286
Loading development environment (Rails 6.0.2.1)
[1] pry(main)> show-source Devise::RegistrationsController

From: /home/linuxbrew/.linuxbrew/lib/ruby/gems/2.7.0/gems/devise-4.7.2/app/controllers/devise/registrations_controller.rb @ line 3:
Class name: Devise::RegistrationsController
Number of monkeypatches: 4. Use the `-a` option to display all available monkeypatches
Number of lines: 166

class Devise::RegistrationsController < DeviseController
  prepend_before_action :require_no_authentication, only: [:new, :create, :cancel]
  prepend_before_action :authenticate_scope!, only: [:edit, :update, :destroy]
  prepend_before_action :set_minimum_password_length, only: [:new, :edit]

  # GET /resource/sign_up
  def new
    build_resource
    yield resource if block_given?
    respond_with resource
  end

  # POST /resource
  def create
    build_resource(sign_up_params)

    resource.save
    yield resource if block_given?
    if resource.persisted?
      if resource.active_for_authentication?
        set_flash_message! :notice, :signed_up
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      set_minimum_password_length
      respond_with resource
    end
  end
:

如果您不想依赖撬动并坚持使用 IRB,您可以 cobble something together with Method#source_location 和 IO.readlines。但恕我直言,这似乎是在浪费时间