加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用Datamapper在Sinatra中选择,复选框和单选按钮元素

发布时间:2020-12-17 02:37:38 所属栏目:百科 来源:网络整理
导读:将Datamapper与Sinatra一起使用,保存文本属性非常简单: DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/tailor.db") class Person include DataMapper::Resource property :id,Serial property :name,String,:required = true property :height,:requir
将Datamapper与Sinatra一起使用,保存文本属性非常简单:

DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/tailor.db")  
class Person  
  include DataMapper::Resource  
  property :id,Serial  
  property :name,String,:required => true
  property :height,: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 => ‘文字’这是一件轻而易举的事.但是,我在尝试使用复选框设置布尔值(属性:test,Boolean,:required => false)时遇到了麻烦. This question是类似的,但没有解决如何做一个简单的布尔值.

另外,设置不接受任何字符串的值的最简单方法是什么,而只是一组预定义的选项 – 作为允许一个选择的选择,还是允许多个选项的一组单选按钮?

编辑:

我想出了复选框:

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

并在视图中:

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

解决方法

当您提交带有复选框的表单时,如果未指定值,则默认为字符串on.此外,如果未选中该复选框,则根本不会提交.因此,结果是在你的处理程序中,params [:test](假设复选框名为test)如果未选中则为nil,如果是,则为字符串on.

期望为Datamapper中的布尔属性分配一个布尔值(true或false),或一个small set of values that it will implicitly convert.on和nil之一不在这些值中,因此当您尝试将值分配给Datamapper时,它将失败验证而不是保存:

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

生产:

["Test must be of type TrueClass"]

解决此问题的一种方法是检入处理程序并在分配给属性时将值显式转换为布尔值:

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

另一种方法是将HTML复选框中的值设置为Datamapper将转换的值之一,以便您可以直接传递它.您可以在表单中使用多个具有相同名称的控件,它们将按照它们在页面中显示的顺序提交. Sinatra将仅在创建params散列时使用最后一个,因此如果您添加一个与复选框前面的复选框同名的隐藏输入,那么如果未选中它,则该值将是隐藏输入的值.如果选中它,它的值将覆盖隐藏输入的值.

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

现在params [:test]将是’f’或’t’,这两个Datamapper都会为你转换,所以你可以简单地做

p.test = params[:test]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读