【发布时间】:2015-02-25 13:31:50
【问题描述】:
如何在 Rails 4 中找到为控制器定义的控制器方法?我在Rails.application 中环顾四周,发现定义了命名路由但没有定义方法。
【问题讨论】:
-
也许在定义控制器的
controllers文件夹中?或者你在问ActionController::Base?
标签: ruby-on-rails ruby-on-rails-4
如何在 Rails 4 中找到为控制器定义的控制器方法?我在Rails.application 中环顾四周,发现定义了命名路由但没有定义方法。
【问题讨论】:
controllers 文件夹中?或者你在问ActionController::Base?
标签: ruby-on-rails ruby-on-rails-4
如果您想列出特定控制器内定义的所有方法(即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_methodsUsersController.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
【讨论】:
TestClass.instance_methods(false)
只获取属于该类的实例方法。
【讨论】:
method_defined? 似乎很容易找出是否为类定义了方法。例如,如果控制器中有索引操作,QuotesController.method_defined?(:index) 返回 true。
例如,obj_instance.methods.include?(:method_name)
这是一篇关于 method_defined 的帖子?和方法。包括?: Given a class, see if instance has method (Ruby)。
【讨论】:
QuotesController.instance_methods(false)。 method_defined? 用于检查现有方法。