如何在rails代码中查找方法

时间:2012-11-13 13:55:44

标签: ruby-on-rails ruby-on-rails-3

我正在查看一些开源代码,以便更好地熟悉rails代码。

我在application_controller

中看到以下内容
  def can_signup?
    [ :allowed, :needs_approval ].include? Setting.user_signup
  end

我似乎无法找到代码Setting.user_signup

中定义此方法的位置

Setting是一个模型

我能错过什么?链接到代码:https://github.com/fatfreecrm/fat_free_crm/blob/master/app/controllers/application_controller.rb#L155-157

Grep输出:

/rails_projects/fat_free_crm $ grep -r --include="*.rb" "user_signup" .
./app/controllers/application_controller.rb:    [ :allowed, :needs_approval ].include? Setting.user_signup
./app/controllers/users_controller.rb:      if Setting.user_signup == :needs_approval
./app/models/users/user.rb:    self.suspended? && self.login_count == 0 && Setting.user_signup == :needs_approval
./app/models/users/user.rb:    self.suspended_at = Time.now if Setting.user_signup == :needs_approval && !self.admin
./spec/controllers/authentications_controller_spec.rb:          Setting.stub!(:user_signup).and_return(:needs_approval)
./spec/controllers/users_controller_spec.rb:        Setting.stub!(:user_signup).and_return(:needs_approval)
./spec/models/users/user_spec.rb:    Setting.stub(:user_signup).and_return(:needs_approval)
./spec/models/users/user_spec.rb:    Setting.stub(:user_signup).and_return(:needs_approval)

2 个答案:

答案 0 :(得分:3)

在这种情况下,Setting模型正在使用method_missing,这是一个在引发NoMethodError异常时调用(如果已定义)的特殊方法。

此处method_missing的更多信息: http://rubylearning.com/satishtalim/ruby_method_missing.html

如果您查看method_missingSetting的实施情况,请执行以下操作: https://github.com/fatfreecrm/fat_free_crm/blob/master/app/models/setting.rb#L54-65

您会发现Setting.user_signup将成为Setting['user_signup'],因此[]方法将以user_signup作为第一个参数调用: https://github.com/fatfreecrm/fat_free_crm/blob/master/app/models/setting.rb#L69-84

根据文档,该方法([])将搜索数据库表或.yml文件中的设置,其名称等于第一个参数,然后返回相对值。

答案 1 :(得分:0)

由于Ruby是一种动态语言,因此查找方法的最佳方法是搜索字符串本身。请记住,由于方法可能是动态创建的,因此代码中的任何位置都可能没有实际def user_signup,但方法可能仍然存在。

要在所有项目中搜索字符串,您可以使用编辑器(无论哪个都是 - 所有这些都有此选项),或者只使用应用程序根目录中的grep -r user_signup .