私は現在、Ruby on Rails 5アプリケーションでクライアント用のバッジシステムを開発中です。すべてのバッジをシステムにハードコードする必要はありません。危険な結果をもたらす方法としてeval()
が見つかりました。Rails 5のバッジシステム用のevalのエントリを取り除く
アプリ/モデル/ user.rb
class User
has_many :awards, dependent: :destroy
end
アプリ/モデル/ badge.rb
class Badge
has_many :awards, dependent: :destroy
# name - string - Name of the badge
# icon - string - URL of badge icon
# description - text - Long text description of the badge
# criterion - text - boolean operation to eval() to earn badge
end
アプリ/モデル/:
は、ここに私の現在の戦略ですaward.rb
class Award
belongs_to :user
belongs_to :badge
def self.automatic_award
User.find_each do |user|
Badge.find_each do |badge|
# If the badge has not been awarded to the user
if Award.where(user: user, badge: badge).blank?
# If the badge criteria is met
if eval(badge.criterion.untaint)
Award.create(user: user, badge: badge)
# Add method to notify user of award.
end
end
end
end
end
end
私はAward.automatic_awardメソッドを定期的に(10分ごとに)実行するように書いています。バッジはログインセキュリティ(標準ユーザーではない)の後ろにAdminによって書き込まれますが、セキュリティと汚染エントリ。
私には何が欠けていますか?より良い方法がありますか?