0

我正在查看一些开源代码以更好地熟悉 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)
4

2 回答 2

3

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

更多信息在method_missing这里: http ://rubylearning.com/satishtalim/ruby_method_missing.html

如果您查看以下method_missing实现Settinghttps ://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 文件中搜索名称等于第一个参数的设置,然后返回相对值。

于 2012-11-13T14:20:04.897 回答
0

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

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

于 2012-11-13T14:01:37.663 回答