Создание новой записи в сиквеле с помощью Sinatra - PullRequest
1 голос
/ 18 января 2011

У меня есть следующая модель:

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, которые я хочу опубликовать?

Спасибо!

1 Ответ

2 голосов
/ 19 января 2011

Ваше первое создание не работает как написано, потому что у вас нет переменной с именем "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
...