我正在查看一些开源代码,以便更好地熟悉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)
答案 0 :(得分:3)
在这种情况下,Setting
模型正在使用method_missing
,这是一个在引发NoMethodError
异常时调用(如果已定义)的特殊方法。
此处method_missing
的更多信息:
http://rubylearning.com/satishtalim/ruby_method_missing.html
如果您查看method_missing
中Setting
的实施情况,请执行以下操作:
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 .
。