我是早期的红宝石开发人员,请原谅我,如果这很明显的话。
使用gioco gem实现游戏化概念我重命名了一些类和引用以更好地适应项目(测试了所有内容并且它正在工作)。
有问题的重命名是Kind => BadgeKind。
以下任务中的这一行:
r.points << Point.create({ :badge_kind_id => kinds.id, :value => '#{args.points}'})
kinds.id
背后的概念是什么?如何解决这个问题?
错误:
NameError: undefined local variable or method 'kinds' for main:Object
我尝试过:badge_kind
,badge_kinds
任务:
task :add_badge, [:name, :points, :kind, :default] => :environment do |t, args|
arg_default = ( args.default ) ? eval(args.default) : false
if !args.name || !args.points || !args.kind
raise "There are missing some arguments"
else
badge_string = "kind = BadgeKind.find_or_create_by(name: '#{args.kind}')\n"
badge_string = badge_string + "badge = Badge.create({
:name => '#{args.name}',
:points => '#{args.points}',
:badge_kind_id => kind.id,
:default => '#{arg_default}'
})
"
if arg_default
# changing User.find(:all) to User.all
badge_string = badge_string + 'resources = User.all
'
badge_string = badge_string + "resources.each do |r|
r.points << Point.create({ :badge_kind_id => kinds.id, :value => '#{args.points}'})
r.badges << badge
r.save!
end
"
end
badge_string = badge_string + "puts '> Badge successfully created'"
# puts "badge_string:\n" + badge_string
eval badge_string
end
答案 0 :(得分:0)
您的应用程序中似乎已经有Kind
和Badge
的表格。如果是这种情况,那么将Badge
重命名为BadgeKind
并不是一个好主意。原因是因为这种表示法通常用于连接表,看起来你可能正在与一个表冲突。现在,我猜测Badge
可以有Kind
,反之亦然。为了实现这一点,可能会有一个包含其关系的BadgeKind
表。如果没有看到您的架构文件或迁移,我无法确定,但您可能最好离开它,或至少选择其他名称,如BadgeType
。
此外,值得注意的是,构建使用eval执行的字符串被视为反模式。 Eval很慢,并且还会使您的应用程序暴露于恶意代码注入。你的风险较小,因为看起来这是一个rake任务,但即便如此,如果你重构这个代码,你应该尝试不同的策略。看起来重构起来会相对简单。