【问题标题】:Creating new record in Sequel via Sinatra通过 Sinatra 在 Sequel 中创建新记录
【发布时间】:2011-02-06 22:39:22
【问题描述】:

我有以下型号:

DB.create_table :teams do  
  primary_key :id
  column :name, :text, :unique=>true
end

DB.create_table :players do  
  primary_key :id
  column :name, :text, :unique=>true
  column :position, :text
  foreign_key :team_id
end

class Team < Sequel::Model
    plugin :json_serializer
    one_to_many :players
end

class Player < Sequel::Model
    plugin :serialization, :json
    many_to_one :teams
end

我的完整代码看起来像

require 'rubygems'
require 'sequel'
require 'sinatra'
require 'db' #model file
require 'thread'
require 'json'
require "sinatra/reloader" if development?  # reload

before do
  @teams = Team.all
end

get '/teams/:id' do |id|
  @team = Team[id]
  haml :team_view
end

post '/teams/?' do 
    Team.create(:name => 'FC Barcelona') 
#here: Read error: #<NoMethodError: undefined method `bytesize' for [:name, "FC Barcelona"]:Array>

end

我想错了吗?如何正确地做到这一点? 你能给我一些工作的例子吗? 如何处理我要发布的 JSON 数据?

谢谢!

【问题讨论】:

  • 什么意思?
  • 我不确定 JSON 与您的问题/问题有什么关系。
  • 您不应该在 Model.new 块中调用 save 。相反,使用 create 而不是 new(create 也需要一个可选块)。

标签: ruby sinatra sequel


【解决方案1】:

您的第一个创建没有按所写的那样工作,因为您没有名为“name”的变量。也许你的意思是b.name = jdata

它适用于我的有效名称属性,并且对 create 的调用也可以正常工作:

require 'sequel'
p Sequel::VERSION #=> "3.15.0"

DB = Sequel.sqlite

DB.create_table :teams do  
  primary_key :id
  column :name, :text, :unique=>true
end

DB.create_table :players do  
  primary_key :id
  column :name, :text, :unique=>true
  column :position, :text
  foreign_key :team_id
end

class Team < Sequel::Model
  plugin :json_serializer
  one_to_many :players
end

class Player < Sequel::Model
  plugin :serialization, :json
  many_to_one :teams
end

begin
  Team.new do |b|
    b.name = name
    b.save
  end
rescue Exception=>e
  p e
  #=> #<NameError: undefined local variable or method `name' for main:Object>
end

Team.new do |b|
  b.name = "Boo!"
  b.save
end
Team.create(:name => 'FC Barcelona')

p Team.all
# [
#  #<Team @values={:id=>1, :name=>"Boo!"}>,
#  #<Team @values={:id=>2, :name=>"FC Barcelona"}>
# ]

您需要分享更多详细信息,以便我们重现您的问题,然后我们才能提供帮助。另请注意,您的代码包含一些红鲱鱼,我在上面包含这些只是为了完整性。 Player 表、模型、关系和 JSON 序列化都不会影响我的测试用例。代码也可以是:

require 'sequel'
DB = Sequel.sqlite
DB.create_table :teams do  
  primary_key :id
  column :name, :text, :unique=>true
end
class Team < Sequel::Model; end
Team.create(:name => 'FC Barcelona')
p Team.all

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 2018-02-26
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多