生成gem

rails plugin new yaffle

为String类添加实例方法to_squawk

#先写测试文件:yaffle/test/core_ext_test.rb 
require 'test_helper'
class CoreExtTest < ActiveSupport::TestCase
  def test_to_squawk_prepends_the_word_squawk
    assert_equal "squawk! Hello World", "Hello World".to_squawk
  end
end

#yaffle/lib/yaffle.rb 
require 'yaffle/core_ext'
module Yaffle
end

#yaffle/lib/yaffle/core_ext.rb 
String.class_eval do
  def to_squawk
    "squawk! #{self}".strip
  end
end

#执行测试文件,也可以在test/dummy项目中进行实际演示
bin/test

为"active_record"添加"acts_as_yaffle"类方法和squawk实例方法

#测试文件,yaffle/test/acts_as_yaffle_test.rb
require 'test_helper'
class ActsAsYaffleTest < ActiveSupport::TestCase
  def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
    assert_equal "last_squawk", Hickwall.yaffle_text_field
  end

  def test_a_wickwalls_yaffle_text_field_should_be_last_tweet
    assert_equal "last_tweet", Wickwall.yaffle_text_field
  end

  def test_hickwalls_squawk_should_populate_last_squawk
    hickwall = Hickwall.new
    hickwall.squawk("Hello World")
    assert_equal "squawk! Hello World", hickwall.last_squawk
  end

  def test_wickwalls_squawk_should_populate_last_tweet
    wickwall = Wickwall.new
    wickwall.squawk("Hello World")
    assert_equal "squawk! Hello World", wickwall.last_tweet
  end
end
#正式代码,yaffle/lib/yaffle/acts_as_yaffle.rb 
module Yaffle
  module ActsAsYaffle
    extend ActiveSupport::Concern

    included do
    end

    module ClassMethods
      def acts_as_yaffle(options = {})
        cattr_accessor :yaffle_text_field
        self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s

        include Yaffle::ActsAsYaffle::LocalInstanceMethods
      end
    end

    module LocalInstanceMethods
      def squawk(string)
        write_attribute(self.class.yaffle_text_field, string.to_squawk)
      end
    end
  end
end
#rails generate model Hickwall last_squawk:string
#rails generate model Wickwall last_squawk:string 
#测试文件test/dummy/app/models/application_record.rb 
class ApplicationRecord < ActiveRecord::Base
  include Yaffle::ActsAsYaffle

  self.abstract_class = true
end

# test/dummy/app/models/hickwall.rb 
class Hickwall < ApplicationRecord
  acts_as_yaffle
end

# test/dummy/app/models/wickwall.rb 
class Wickwall < ApplicationRecord
  acts_as_yaffle yaffle_text_field: :last_tweet
end

results matching ""

    No results matching ""