2010-07-04 3 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 (available/occupied)를 room.free (true/false)보다 호출하고 싶습니다. – schwift

관련 문제