2010-07-04 63 views
0

我正在嘗試做一個簡單的房間管理服務。房間有這些屬性:如何使用DataMapper和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 

然後,我創建通過這個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"} 

一個新的空間這樣

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 

當檢查框:狀態爲「佔領「但是當我放棄它時,對象不會保存。我認爲它會工作,因爲它默認爲「免費」,但沒有...

回答

2

無論什麼愚蠢的原因,複選框不會被提交,如果他們沒有被點擊。這意味着它們不在打擊您的應用程序的哈希中。當你說: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

哦,這就是爲什麼...以及這個作品。涼。謝謝。我正在考慮將其設置爲布爾值,但我寧願將room.status(可用/佔用)稱爲room.free(true/false)。 – schwift 2010-07-05 11:21:44