在Rails中从控制台调用ApplicationController方法

15
在Rails中,假设文件已经加载,如何从控制台调用my_method
# some_file.rb
class MyClass < ApplicationController::Base
  def my_method(args)

这听起来很有趣。但我的第一个想法是控制器内的所有方法都可以被视图访问。当您访问控制台时,您正在访问ActiveRecord并获得对模型及其方法的访问权限。正如我所说,这将是我的第一个想法。 - Daniel
https://dev59.com/qHVC5IYBdhLWcg3w51hv有关于同一问题的非常好的答案。 - oozzal
3个回答

33

另一种非常简单的方法是使用一个 ApplicationController 实例本身。

ApplicationController < ActionController::Base
  def example
    "O HAI"
  end
end

然后在控制台中,你可以执行以下操作:

>> ApplicationController.new.example

这将输出以下内容:

O HAI

当然,这种方法有一个限制,无法访问正常请求中的所有内容,例如request对象本身。如果您需要此功能,可以像Patrick Klingemann建议的那样使用调试器...我个人推荐使用Pry:

对您来说可能太晚了,但希望能帮到将来的某个人。


1
非常好的解决方案,帮助编写视图和控制器测试用例。 - AMIC MING

3

使用调试器:

在你的Gemfile中添加:

gem 'debugger'

然后从终端输入:

> bundle
> rails s --debugger

在控制器动作中,你要操作的是:
class WidgetsController < ApplicationController
  def index
    debugger
    @widgets = Widget.all
    respond_with @widgets
  end
end

然后将浏览器指向:http://localhost:3000/widgets,该页面不会完成加载。返回运行服务器的终端,您将进入一个交互式调试会话,可以运行:my_method


我竟然忘记了调试。还要注意的是,你不能像那样访问启动服务器的方法。你需要这样做:rails s --debugger。即使在这种情况下,你得到的唯一响应也只是“只需点击一个ApplicationController方法”...没有实际输出。 - Daniel
我在睡觉的时候想到了“--debugger”,这是个好主意。我不确定我理解你评论中的第二句话。 - Patrick Klingemann
我试图重现Martin为我们设置的案例,但我得到的是那个消息...我是说当我调用该方法时,我实际上无法检查其中发生了什么。不过也许我做错了什么... - Daniel
(免责声明:这只是我的个人意见。)调试器已经过时了,老兄。试试pry吧! - slant

1

虽然这不是所问的问题,但你也可以像使用debugger一样使用pry gem进行调试。

Gemfile中添加:

gem "pry"
gem "pry-remote"
gem "pry-stack_explorer"
gem "pry-debugger"

在你的方法中:
def myMethod
  binding.pry
  # some code
end

完成了!

当你运行你的方法时,页面处理将会在binding.pry处冻结,pry将接管提示符。每个新步骤输入n,并在“实时”中玩弄可以打印的变量(只需键入它们)!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接