Ruby on rails 未定义的方法';列名称';创建模型实例时
我目前正在rails中构建一个管理webapp。在我的应用程序环境中,玩家必须完成一些任务才能获得奖励。在允许玩家领取奖励之前,每个任务都有一定数量的任务要完成 以前,任务和任务数据保存在.txt文件中,现在已移动到数据库结构中。我的应用程序必须提供的功能之一是读取.txt文件并将数据加载到数据库 这是我的任务模型和模式: 型号:Ruby on rails 未定义的方法';列名称';创建模型实例时,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我目前正在rails中构建一个管理webapp。在我的应用程序环境中,玩家必须完成一些任务才能获得奖励。在允许玩家领取奖励之前,每个任务都有一定数量的任务要完成 以前,任务和任务数据保存在.txt文件中,现在已移动到数据库结构中。我的应用程序必须提供的功能之一是读取.txt文件并将数据加载到数据库 这是我的任务模型和模式: 型号: class QuestTask < ActiveRecord::Base self.table_name = 'quest_task' self
class QuestTask < ActiveRecord::Base
self.table_name = 'quest_task'
self.primary_key = :task_id
has_many :player_task_progresses, :class_name => 'PlayerTaskProgress', :foreign_key => :task_id
belongs_to :quest, :class_name => 'Quest', :foreign_key => :quest_id
has_many :quest_task_texts, :class_name => 'QuestTaskText', :foreign_key => :task_id
end
每次尝试运行QuestTask.create
时,它都会抛出以下错误:
NoMethodError (undefined method `column_names' for nil:NilClass)
在控制器中的以下代码段上:
data = {
:quest_id => id,
:exp_reward => d[key]['Exp'].to_i,
:cash_reward => d[key]['Cash'].to_i,
:pill_reward => d[key]['Gems'].to_i,
:required_quest => d[key]['RequiredQuest'].to_i,
:npc_id => d[key]['Survivor'].to_i,
:player_needs_clan => d[key]['ClanRequired'].to_i,
:required_level => d[key]['MinLevel'].to_i
}
begin
quest = Quest.find(data[:quest_id])
quest.update(data)
rescue ActiveRecord::RecordNotFound
quest = Quest.create(data)
end
#Task string example c:32:15|u:npc_sara
tasks = d[key]['Tasks'].split('|')
tasks.each do |task|
tdata = {:task_id => nil,
:quest_id => id
}
info = task.split(':')
if info[0] == 'c'
tdata[:task_type] = 1
tdata[:foreign_id] = info[1].to_i
tdata[:amount] = info[2].to_i
elsif info[0] == 'k'
tdata[:task_type] = 2
tdata[:class] = info[1]
tdata[:amount] = info[2].to_i
if info[3] != '__NONE__'
data[:map] = info[3]
end
tdata[:coordinates] = info[4]
tdata[:trigger_range] = info[5]
elsif info[0] == 'u'
tdata[:task_type] = 4
tdata[:class] = info[1]
tdata[:amount] = 1
elsif info[0] == 'w'
tdata[:task_type] = 5
tdata[:class] = info[1]
tdata[:amount] = 1
elsif info[0] = 'x'
tdata[:task_type] = 6
tdata[:class] = info[1]
end
print tdata
res = QuestTask.find_by(quest_id: id.to_s)
if res == nil
print tdata
QuestTask.create(tdata)
else
res.delete()
QuestTask.create(tdata)
end
在前面的代码中,变量d
是在解析数据文件后构建的哈希,变量id
是用户输入
例如,我得到的最后一个tdata是:
{:task_id=>nil, :quest_id=>1, :task_type=>1, :foreign_id=>15, :amount=>5}
将task_id更改为数字没有任何区别(它设置为自动增量)
为什么会抛出错误
create_table "quest_task", primary_key: "task_id", force: :cascade do |t|
t.integer "quest_id", limit: 4, null: false
t.integer "task_type", limit: 4, null: false
t.integer "foreign_id", limit: 4, default: 0, null: false
->t.string "class", limit: 64
t.integer "amount", limit: 4, default: 0, null: false
t.string "coordinates", limit: 64
t.float "trigger_range", limit: 24, default: 0.0
end
更改列名,类是保留字。这部分代码没有问题,它在数据库中找到了任务记录。如果它不存在,那么我已经捕获了NotFound异常,它将创建它而不是更新它。问题就在我发布的代码的末尾
create_table "quest_task", primary_key: "task_id", force: :cascade do |t|
t.integer "quest_id", limit: 4, null: false
t.integer "task_type", limit: 4, null: false
t.integer "foreign_id", limit: 4, default: 0, null: false
->t.string "class", limit: 64
t.integer "amount", limit: 4, default: 0, null: false
t.string "coordinates", limit: 64
t.float "trigger_range", limit: 24, default: 0.0
end