我是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)是否仅用于验证表单数据?即,检查从表单发送的散列密钥是否正确,如数据库端(字段名称或数据库连接错误),不是此语句的业务,因此它将抛出异常。
非常感谢。
答案 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