使用している gem の特定の ruby ファイルを置き換えたい。
私が使用している宝石は private_pub です: https://github.com/ryanb/private_pubで、置き換えようとしているファイルは次のとおりです: https://github.com/ryanb/private_pub/blob/master/lib/private_pub/faye_extension .rb
そこで私がやろうと決めたのは、私の Rails プロジェクトで、次のコードを含む faye_extension.rb という名前の config/initializers に新しいファイルを追加することでした:
PrivatePub::FayeExtension
puts "Overide loaded"
module PrivatePub
# This class is an extension for the Faye::RackAdapter.
# It is used inside of PrivatePub.faye_app.
class FayeExtension
# Callback to handle incoming Faye messages. This authenticates both
# subscribe and publish calls.
def incoming(message, callback)
puts "MY MEGA CHANGE"
logger.debug "inside incoming override"
if message["channel"] == "/meta/subscribe"
puts "subscription request received"
authenticate_subscribe(message)
elsif message["channel"] !~ %r{^/meta/}
puts "publish request received"
authenticate_publish(message)
end
callback.call(message)
end
private
# Ensure the subscription signature is correct and that it has not expired.
def authenticate_subscribe(message)
subscription = PrivatePub.subscription(:channel => message["subscription"], :timestamp => message["ext"]["private_pub_timestamp"])
if message["ext"]["private_pub_signature"] != subscription[:signature]
message["error"] = "Incorrect signature."
elsif PrivatePub.signature_expired? message["ext"]["private_pub_timestamp"].to_i
message["error"] = "Signature has expired."
end
end
# Ensures the secret token is correct before publishing.
def authenticate_publish(message)
if PrivatePub.config[:secret_token].nil?
raise Error, "No secret_token config set, ensure private_pub.yml is loaded properly."
elsif message["ext"]["private_pub_token"] != PrivatePub.config[:secret_token]
message["error"] = "Incorrect token."
else
message["ext"]["private_pub_token"] = nil
end
end
end
end
'PrivatePub::FayeExtension' を一番上に含めた理由は、FayeExtension クラスが gem の実装をオーバーライドするように、自動ロードを強制するためでした。ただし、このロジックを駆動するコード パスを実行すると、追加した puts ステートメントがログに表示されません。「オーバーライドがロードされました」が表示されることに言及することが重要ですが、これが発生すると信じており、その後、どういうわけか、gem の実装が使用されます。これにより、gem の faye_extension.rb が私のバージョンの代わりに使用されていると思われます。
gem のバージョンではなく、自分のバージョンを強制的に使用するにはどうすればよいですか?