Как мне работать с флажками с DataMapper и Sinatra? - PullRequest
0 голосов
/ 05 июля 2010

Я пытаюсь сделать простой сервис по управлению комнатами.Комнаты имеют следующие свойства:

class Room
  include DataMapper::Resource
  validates_is_unique :number

  property :id, Serial
  property :number, Integer
  property :guest, String
  property :status, Enum[ :free, :occupied ], :default => :free
end

Затем я создаю новую комнату, подобную этой

post '/new' do
  content_type :json
  @room = Room.new :guest => params[:guest],
                   :number => params[:number],
                   :status => params[:status]
  if @room.save
    { :number => @room.number, :guest => @room.guest, :status => @room.status }.to_json
  end
end

, через эту форму haml

%form#new_message{:action => '/new', :method => 'post'}
        %p
          %input{:type => "text",      :id => "number", :name => "number"}
          %input{:type => "text",      :id => "guest",  :name => "guest"}
          %input{:type => "checkbox",  :id => "status", :name => "status", :value => "occupied"}
          %input{:type => "submit", :value => "post"}

Когда флажок установленстатус: «занят», но когда я оставляю его не отмеченным, объект не будет сохранен.Я думал, что это будет работать, так как по умолчанию это "бесплатно", но нет ...

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

По какой-то глупой причине, флажки не отправляются, если на них не нажимают.Это означает, что они не находятся в хэше, который попадает в ваше приложение.Когда вы говорите :status => params[:status], вы действительно говорите: status => nil.Поскольку вы установили значение, оно сверяется с вашим перечислением, а nil отсутствует в вашем перечислении, поэтому оно не проходит валидацию.(в зависимости от того, как вы используете это, не кажется ли вам, что это должно быть логическое значение, называемое либо «занято», либо «доступно»?)установите его вообще, и пусть по умолчанию позаботится об этом.Это то, что я выбрал при проверке, переместив его в массовое задание.Код, который я использовал ниже:

require 'rubygems'
require 'sinatra'
require 'haml'
require 'dm-core'
require 'dm-validations'
require 'dm-types'
require 'dm-migrations'
require 'sqlite3'


configure do
  class Room
    include DataMapper::Resource
    validates_uniqueness_of :number
    property :id, Serial
    property :number, Integer
    property :guest, String
    property :status, Enum[ :free, :occupied ], :default => :free
  end
  set :sessions , true
  DataMapper::Logger.new($stdout, :debug)
  DataMapper.setup( :default , "sqlite3://#{Dir.pwd}/development.sqlite3" )  
  DataMapper.finalize
  DataMapper.auto_upgrade!
end


get '/' do
  @rooms = Room.all
  haml :index
end

post '/new' do
  p params
  @room = Room.new params[:room]
  if @room.save
    session[:flash] = "room reserved"
    redirect '/'
  else
    session[:flash] = @room.errors.to_a
    redirect '/new'
  end
end

get '/new' do
  haml :new
end

__END__
@@layout
!!!
%html
  #flash
    = session[:flash].inspect
  = yield

@@new
%form#new_message{:action => '/new', :method => 'post' , :name => 'room' }
  %p
    %input{:type => "text",      :id => "number", :name => "room[number]"}
    %input{:type => "text",      :id => "guest",  :name => "room[guest]"}
    %input{:type => "checkbox",  :id => "status", :name => "room[status]", :value => "occupied"}
    %input{:type => "submit", :value => "post"}

@@index
%table
  - @rooms.each do |room|
    %tr
      %td= room.number
      %td= room.guest
      %td= room.status
0 голосов
/ 23 августа 2011

Просмотр исходного кода HTML вашей веб-формы!Там должно быть скрытое поле, которое устанавливает непроверенные флажки на «0» по умолчанию, в случае, если никто не проверяет их ...

см. Также: http://railscasts.com/episodes/17-habtm-checkboxes?autoplay=true (к концу)

...