ruby-on-rails:update_attributes 覆盖模型验证?

发布于 2024-08-25 16:44:01 字数 589 浏览 4 评论 0原文

我有一个典型的 Post 模型:

class Post< ActiveRecord::Base
    validates_presence_of :user_id                                   #Line 1
    validates_presence_of :title,:body                               #Line 2

在控制器中,我有:

def create
   if request.post? 
       if login_required
           @post = Post.new(params[:post])                            #Line 3
           @post .update_attribute("user_id",session[:userid])        #Line 4

但是,如果第 2 行的验证失败,则仍将创建 Post,除非第 4 行被注释掉。

1)为什么?

2)关于修复的建议?

谢谢

I have a typical, Post model:

class Post< ActiveRecord::Base
    validates_presence_of :user_id                                   #Line 1
    validates_presence_of :title,:body                               #Line 2

in the controller, I have:

def create
   if request.post? 
       if login_required
           @post = Post.new(params[:post])                            #Line 3
           @post .update_attribute("user_id",session[:userid])        #Line 4

However, if the validations on Line 2 fail the Post will still be created, unless Line 4 is commented out.

1) Why?

2) Suggestions on a fix?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

那伤。 2024-09-01 16:44:01

来自 update_attribute 的条目ActiveRecord::Persistence 的文档

更新单个属性并保存
记录,无需经过
正常验证程序。这是
对于布尔标志特别有用
现有记录。

似乎这是一个漏洞,可以帮助您在对记录进行快速调整时避免验证开销。如果你想要验证,只需使用

@post.update_attributes(:user_id => session[:userid])

From the entry on update_attribute in the doc for ActiveRecord::Persistence:

Updates a single attribute and saves
the record without going through the
normal validation procedure. This is
especially useful for boolean flags on
existing records.

Seems like it's a loophole to help you avoid the overhead of validation when you make a quickie tweak to a record. If you want validation, just use

@post.update_attributes(:user_id => session[:userid])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文