【问题标题】:on Rails, how does form_for and validate_presence_of work hand in hand?在 Rails 上,form_for 和 validate_presence_of 如何协同工作?
【发布时间】:2009-05-26 04:27:32
【问题描述】:

当我们在模型中有 validate_presence_of :name 时,然后当我们放入重新渲染“新”的创建操作时,form_for 将填充字段,而 error_messages_for 'story' 将具有正确的错误消息。

这真是太棒了,同时,这看起来像魔术......我发现很多书都没有解释魔术是如何发生的。是通过一些全局变量吗?

当 form_for 被调用时......它是否使用从 @story.save 返回的 @story,而不是来自新操作的 @story = Story.new?因此,如果我将 :story 用于 form_for,则不会在错误时填充字段?

有时我觉得在使用 Ruby on Rails 时我在玩魔法,但我不知道魔法是如何发生的……有点像我让兔子出现,但我不知道我是怎么做到的.所以我真的很想知道 Rails 的内部工作原理。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    是的,Rails 非常神奇。不幸的是,这些只是你必须学会​​接受的东西,一旦你习惯了这些约定,你就可以使用魔法轻松地完成一些非常复杂的事情。

    这里有三个单独的问题,它们单独相对简单,但当你一次全部考虑在内时看起来非常神奇。让我们一一分解:

    当验证失败时,它们不允许保存模型对象并将错误添加到 object.errors 哈希中。

    当您运行 @story.save 时,它​​会启动所有验证。由于@story.name 为空,因此 validates_presence_of :name 会向对象添加错误。

    控制器中的实例变量可用于它们呈现的视图。

    所以,是的,视图可以访问的@story 是同一个@story,它是无效的并且附有错误信息。

    form_for 有多种形式,而你用的那一种很聪明

    您视图中的 form_for 标记可能如下所示:

    <%= form_for @story do |story| =>
    

    这是 form_for 的一个特殊版本,它从传入的对象中推断出各种信息并适当地呈现表单。由于这条线,@story 的一些字段被填充了

    @story = params[:story]
    

    在您的控制器中,因此它会继续为您填写这些字段。它也做一些其他的事情——例如,它检查@story.new_record?看看它应该使用 POST HTTP 方法(RESTful 创建)还是 PUT 方法(RESTful 更新)。

    总之,有很多小魔法要学,但是一旦你学会了大魔法,就会更容易理解。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2010-11-24
      • 2012-07-07
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多