在Rails中更新数据库记录

时间:2018-06-11 11:45:13

标签: ruby-on-rails ruby

我是RoR的新手,我现在对将数据更新到数据库感到困惑。 我最近研究过RoR,如果问题不清楚,请告诉我。

假设我创建了一个表&#34; book&#34;,有3列:&#34; name&#34;,&#34; price&#34;和&#34; author&#34;。< / p>

在rails中实施操作更新时,我将执行以下操作:

def update
  @book = Book.find(params[:id])
  if @book.update({'name': 'Ruby tutorial'})
    redirect_to @book
  else
    render 'edit'
  end
end

这将通过

更新数据库中的记录
if @article.update({'name': 'Ruby tutorial'})

为了测试一些失败案例,我修改了数据库列&#34; name&#34;到了&#34; nane&#34;故意, 我认为声明如果@ article.update 将因为错误的表字段名称而失败,并且代码将转到else块。 因为我认为该语句用于检查rails是否成功将记录保存到数据库中。

但是,我的代码因为错误的字段名而不是转到else块而抛出异常。

我对这种行为感到困惑,会导致什么样的情况 如果@ article.update(params)失败并转到else块?

if @ article.update(params)是否仅用于验证表单数据?即,检查从表单发送的散列密钥是否正确,如数据库端(字段名称或数据库连接错误),不是此语句的业务,因此它将抛出异常。

非常感谢。

1 个答案:

答案 0 :(得分:1)

@book.update(nane: 'name')

将抛出异常 ActiveModel :: UnknownAttributeError:unknown属性。

如果不是异常处理程序。

此处使用if和else块的目的是处理负面情况(由于某些验证失败而导致更新失败)。

update(name: '')

在name列上进行状态验证不会引发异常。它会返回false。如果此处没有if / else块而只是更新语句,则无法知道更新是否成功。

另一种处理方法是使用进行更新。添加!使语句为任何失败抛出异常。

begin
  update!(name '')
rescue Exception
  render 'edit'
end

如上所述拯救异常是一种处理异常的坏方式。我已删除

rescue Exception
  //some action //
end

您必须从Why is it bad style to `rescue Exception => e` in Ruby?了解原因。

你也可以像这样处理特定的RecordInvalid异常。

begin
  update!(name '')
rescue ActiveRecord::RecordInvalid => invalid
   // some action //
end