Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 未定义的方法';列名称';创建模型实例时_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 未定义的方法';列名称';创建模型实例时

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

我目前正在rails中构建一个管理webapp。在我的应用程序环境中,玩家必须完成一些任务才能获得奖励。在允许玩家领取奖励之前,每个任务都有一定数量的任务要完成

以前,任务和任务数据保存在.txt文件中,现在已移动到数据库结构中。我的应用程序必须提供的功能之一是读取.txt文件并将数据加载到数据库

这是我的任务模型和模式:

型号:

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