4

これを行う関数があります:

  def blank_to_negative(value)
    value.is_number? ? value : -1
  end

渡された値が数値でない場合、値は -1 に変換されます。

この機能は主に特定のモデル向けに作成しましたが、この機能の適用範囲は明らかに特定のモデルを超えて広がる可能性があるため、特定のモデルでこの機能を定義することは適切ではないようです。ほぼ確実に、他のモデルやビューでこの関数が必要になるでしょう。

この関数を定義し、どこでも、特にモデルで使用するための最も「Rails Way」な方法は何ですか?

で定義しようとしましたApplicationHelperが、うまくいきませんでした:

class UserSkill < ActiveRecord::Base
  include ApplicationHelper
  belongs_to :user
  belongs_to :skill

  def self.splice_levels(current_proficiency_levels, interest_levels)
    Skill.all.reject { |skill| !current_proficiency_levels[skill.id.to_s].is_number? and !interest_levels[skill.id.to_s].is_number? }.collect { |skill| {
      :skill_id => skill.id,
      :current_proficiency_level => blank_to_negative(current_proficiency_levels[skill.id.to_s]),
      :interest_level => blank_to_negative(interest_levels[skill.id.to_s]) }}
  end 
end

それは私に言った

未定義のメソッド `blank_to_negative' for #

とにかく、あなたがそのようなことを「決して」することになっていないと読んだことがあるので、ちょっと混乱しています。

4

4 に答える 4

3

プロジェクト内のすべてのクラスにそのようなヘルパー メソッドが必要な場合は、これをメソッドとして自由に追加するObjectか、適切と思われるものに追加できます。

module MyApp
  module CoreExtensions
    module Object
      def blank_to_negative
        self.is_number? ? self : -1
      end
    end
  end
end

Object.send :include, MyApp::CoreExtensions::Object
于 2012-08-07T19:47:04.387 に答える
2

いくつかのオプションがあります:

  • メソッドを ActiveRecord にモンキー パッチすると、すべてのモデルで使用できるようになります。

    class ActiveRecord::Base
      def blank_to_negative(value)
        value.is_number? ? value : -1
      end
    end
    
  • 「懸念」モジュールを追加して、選択したモデルにミックスします。

    # app/concerns/blank_to_negate.rb
    module BlankToNegate
      def blank_to_negative(value)
        value.is_number? ? value : -1
      end
    end
    
    # app/models/user_skill.rb
    class UserSkill < ActiveRecord::Base
      include BlankToNegate
      # ...
    end
    
于 2012-08-07T19:46:45.603 に答える
1

Ruby データ型の機能を拡張できます。それらは封印されていません。すべての場所で使用したいので、FIXNUM機能を拡張してメソッドblank_to_negativeを追加してみませんか。

于 2012-08-07T19:58:50.223 に答える
0

これが私がやったことです。このコードを に入れましたconfig/initializers/string_extensions.rb

class String
  def is_number?
    true if Float(self) rescue false
  end 

  def negative_if_not_numeric
    self.is_number? ? self : -1
  end 
end

また、よりも意味があるため、 に名前を変更blank_to_negativeしました。negative_if_not_numericsome_string.negative_if_not_numericsome_string.blank_to_negative

于 2012-08-08T14:30:06.483 に答える