【问题标题】:How to find controller methods defined in Rails 4?如何找到 Rails 4 中定义的控制器方法?
【发布时间】:2015-02-25 13:31:50
【问题描述】:

如何在 Rails 4 中找到为控制器定义的控制器方法?我在Rails.application 中环顾四周,发现定义了命名路由但没有定义方法。

【问题讨论】:

  • 也许在定义控制器的controllers 文件夹中?或者你在问ActionController::Base

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

如果您想列出特定控制器内定义的所有方法(即UsersController):

>> UsersController.instance_methods(false)
=> [:new, :create, :edit, :update, :update_remote, :user_params]

如果你只想要public 方法:

>> UsersController.public_instance_methods(false)
=> [:new, :create, :edit, :update, :update_remote]

如果您需要完整的方法列表,也需要来自祖先的方法,请使用 true(或不带参数,因为它是默认值)调用这些方法:

  • UsersController.instance_methods
  • UsersController.public_instance_methods

更多文档在这里:http://ruby-doc.org//core-2.2.0/Module.html#method-i-instance_methods

instance_methods

返回一个数组,其中包含接收器中公共和受保护实例方法的名称。对于一个模块,这些是公共和受保护的方法;对于一个类,它们是实例(不是单例)方法。如果可选参数为 false,则不包括任何祖先的方法。

public_instance_methods

返回定义的公共实例方法的列表。如果可选参数为 false,则不包括任何祖先的方法。


或者,如果您需要获取“本地”方法,包括其他模块中包含的方法,您可以通过以下方式实现:

u = UsersController.new
u.methods - u.class.superclass.instance_methods

【讨论】:

  • public_instance_methods 只列出了控制器定义的方法,不包括其他模块包含的方法。
  • @user938363 我刚刚用另一种方法更新了答案以列出所有方法(也包括另一个模块中包含的方法)。
【解决方案2】:

TestClass.instance_methods(false)

只获取属于该类的实例方法。

【讨论】:

    【解决方案3】:

    method_defined? 似乎很容易找出是否为类定义了方法。例如,如果控制器中有索引操作,QuotesController.method_defined?(:index) 返回 true。

    例如,obj_instance.methods.include?(:method_name)

    这是一篇关于 method_defined 的帖子?和方法。包括?: Given a class, see if instance has method (Ruby)

    【讨论】:

    • 是的,但这不是您的 OP 的答案,最初您问的是:“如何找到为 Rails 4 中的控制器定义的控制器方法?”所以要找到你必须使用的方法QuotesController.instance_methods(false)method_defined? 用于检查现有方法。
    猜你喜欢
    • 2013-10-03
    • 2013-06-02
    • 2016-04-04
    • 2014-03-09
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多