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の実装を見てみると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 ファイルを検索し、相対値を返します。

于 2012-11-13T14:20:04.897 に答える
0

Ruby は動的言語であるため、メソッドを探す最善の方法は、文字列自体を検索することです。def user_signupメソッドは動的に作成される可能性があるため、コード内のどこにも実際のメソッドが存在しない可能性があることに注意してください。それでもメソッドは存在する可能性があります。

すべてのプロジェクトで文字列を検索するには、エディターを使用するか (すべてのプロジェクトにこのオプションがあります)、grep -r user_signup .アプリのルートから使用します。

于 2012-11-13T14:01:37.663 に答える