4

SinatraでDatamapperを使用すると、テキストプロパティを簡単に保存できます。

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/tailor.db")  
class Person  
  include DataMapper::Resource  
  property :id, Serial  
  property :name, String, :required => true
  property :height, String, :required => false
end  
DataMapper.finalize.auto_upgrade!

...

put '/:id/edit' do
  p = Person.get params[:id]
  p.name = params[:name]
  p.height = params[:height]
  p.save
end

そしてビュー:

%form
  %input{:type => 'text', :name => 'name'}
  %input{:type => 'text', :name => 'height'}
  %input{:type => 'submit', :value => 'Save'}

そよ風:type => 'text'です。ただし、チェックボックスを使用してブール値()を設定しようとすると問題が発生しproperty :test, Boolean, :required => falseます。この質問は似ていますが、単純なブール値を実行する方法については説明していません。

さらに、文字列を受け入れない値を設定する最も簡単な方法は何ですか?1つの選択肢を許可する選択として、または複数の選択肢を許可するラジオボタンのセットとして、事前定義されたオプションのセットだけを設定しますか?

編集:

私はチェックボックスを見つけました:

p.bool = !params[:bool].nil?

とビューで:

  %input{:type => 'checkbox', :name => 'bool', :value => "#{@bool}", :checked => @p.bool}
4

1 に答える 1

5

を使用してフォームを送信する場合、フォームをcheckbox指定しない場合value、デフォルトは stringonです。さらに、チェックボックスが選択されていない場合、送信されません。その結果、ハンドラーでは(が という名前であるとparams[:test]仮定して) は、チェックされていない場合は文字列、チェックされていた場合は文字列のいずれかになります。checkboxtestnilon

Datamapper のブール値プロパティは、ブール値 (trueまたはfalse)、または暗黙的に変換される値の小さなセットのいずれかが割り当てられることを期待しています。onこれらの値に含まれてnilいないため、値を Datamapper に割り当てようとすると、検証に失敗し、保存されません。

...
p.test = 'on'
if !p.save
  p p.errors[:test]
end

生成:

["Test must be of type TrueClass"]

これを修正する 1 つの方法は、ハンドラーをチェックインし、プロパティに代入するときに値を明示的にブール値に変換することです。

p.test = params[:test] == 'on' ? true : false

もう 1 つの手法はvalue、HTML チェックボックスの を、Datamapper が変換する値の 1 つに設定して、直接渡すことができるようにすることです。フォームに同じ名前の複数のコントロールを含めることができ、それらはページに表示される順序で送信されます。paramsSinatra はハッシュを作成するときに最後のもののみを使用するため、チェックボックスのhiddenにチェックボックスと同じ名前の入力を追加すると、チェックされていない場合、値は非表示の入力の値になります。チェックされている場合、その値は非表示の入力の値を上書きします。

%input{:type => 'hidden', :name => 'foo', :value => 'f'}
%input{:type => 'checkbox', :name => 'foo', :value => 't'}

params[:test]どちらも'f'Datamapperによって't'変換されるため、簡単に実行できます。

p.test = params[:test]
于 2012-12-01T09:44:24.570 に答える