2010-07-04 26 views
0

J'essaye de faire un service simple de gestion de pièce. Les chambres ont ces propriétés:Comment travailler avec des cases à cocher avec DataMapper et Sinatra?

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 

Puis-je créer une nouvelle salle comme celle-

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 

par ce formulaire 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"} 

Lorsque la case est cochée le: état est « occupé "mais quand je le laisse décoché l'objet ne sauvera pas. Je pensais que cela fonctionnerait car il est par défaut "libre" mais non ...

Répondre

2

Pour une raison stupide, les cases à cocher ne sont pas soumises si elles ne sont pas cliquées. Cela signifie qu'ils ne sont pas dans le hachage qui frappe votre application. Quand vous dites :status => params[:status] vous dites vraiment: status => nil. Puisque vous avez défini une valeur, elle vérifie celle-ci par rapport à votre énumération, et nil n'est pas dans votre énumération, donc elle échoue aux validations. (basé sur comment vous utilisez ceci, ne semble-t-il pas qu'il devrait être un booléen appelé "occupé" ou "disponible"?)

De toute façon, vous pourriez soit explicitement le mettre en libre, ou ne pas le définir du tout, et laissez le défaut s'en occuper. C'est ce que j'ai choisi en le vérifiant, en le déplaçant dans une affectation de masse. Le code que j'ai utilisé est ci-dessous.

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

Oh, c'est pourquoi ... Eh bien cela fonctionne. Cool. Je vous remercie. Je pensais en faire un booléen mais je préfère appeler room.status (disponible/occupé) que room.free (true/false). – schwift