Ruby 如何使这段代码更好?(sinatra和数据映射器)

Ruby 如何使这段代码更好?(sinatra和数据映射器),ruby,sinatra,datamapper,Ruby,Sinatra,Datamapper,我是新手,我正在使用datamapper和sinatra构建一个基本应用程序。我有一个设置页面,有几个不同设置的文本输入 查看此页面时,应从数据库中提取信息并填充输入框(如果有) 对于我的设置类,我有:name和:value 到目前为止,我的代码正在运行,如果名称不存在,可以创建一个设置,否则会更新它 Setting.first_or_create(:name => "seed").update(:name => "seed", :value => params[:seed])

我是新手,我正在使用datamapper和sinatra构建一个基本应用程序。我有一个设置页面,有几个不同设置的文本输入

查看此页面时,应从数据库中提取信息并填充输入框(如果有)

对于我的设置类,我有:name和:value

到目前为止,我的代码正在运行,如果名称不存在,可以创建一个设置,否则会更新它

Setting.first_or_create(:name => "seed").update(:name => "seed", :value => params[:seed])
3个问题:

  • 如果输入为空(显然在第一次之后),它将用“”覆盖它

  • 如何缩短此代码?在一个真正的ruby程序中,我应该定义一个方法,这样就不会有太多的冗余代码了吗?我有5个设置,所以我觉得那行代码只使用了5次,但只有一些不同的东西,这有点糟糕。困难在于,我将被迫将我所有的输入都命名为我正在使用的确切散列。我不确定这是否是一个糟糕的做法,或者我是否应该明确地做5次

  • 为了“获取”数据以显示它,我有以下几点:

    @seed  = Setting.get(:name => "seed")
    
    这显然不起作用。。。我需要的是获取params[:value]WHERE:name=>“seed”并使用它打印出来。我不知道怎么做

  • @seed=Setting.first_或_create(:name=>“seed”)#获取并存储
    #仅当存在时更新
    @如果params[:seed],则更新(:name=>“seed”,:value=>params[:seed])。是否存在?
    
    在将
    params[:seed]
    存储回数据库之前,验证其值可能是明智的。所有设置是否一次保存(使用相同的方法)?多亏了Taryn,我才将它们全部保存下来,现在我正试图在ERB文件中调用它们,但我无法:/它们似乎都为零,即使它们保存在“testseed”的DBundefined方法“present”中:StringinRails
    present?
    是Rails添加到
    Object
    的一种方法(与基本对象类一样)。Rails中的每个类都应该
    首先响应(:present?
    它与
    blank?
    相反-检查是否添加了?最后(我时不时地打错字)。然后试试
    !参数[:seed]。空白?
    我的错误。。。rails不应该在标签中:/i如何在常规ruby中检查它?如果失败,那么编写自己的:
    class对象;def空白?;self.nil?| |(self.response_to?(:empty?&!self.empty?);结束;现在怎么样!自身空白?;结束;结束太棒了!感谢它的工作:)我应该把所有这些放在一个像defsave(attr)这样的方法中,这样我就可以避免同样的东西输入5次吗?就最佳实践而言,我不确定什么是“最佳”
    
    @seed = Setting.first_or_create(:name => "seed") # fetch and store
    # update only if there was one
    @seed.update(:name => "seed", :value => params[:seed]) if params[:seed].present?
    
    <!-- show the value in the page -->
    <%= @seed.value %>