在Rails上,form_for和validate_presence_of如何协同工作?

时间:2009-05-26 04:27:32

标签: ruby-on-rails

当我们在模型中有validate_presence_of:name时,然后当我们放入我们重新呈现'new'的create动作时,form_for将填充字段,而error_messages_for'tory'将具有正确的错误消息。

这真的很棒,而且同时,这看起来像魔术......我发现很多书都没有解释魔法是如何发生的。它是由一些全局变量?

当调用form_for时...是否使用从@ story.save返回的@story,而不是来自新操作的@story = Story.new?所以,如果我使用:form_for的故事,那么这些字段将不会填充错误?

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

1 个答案:

答案 0 :(得分:6)

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

这里有三个单独的问题,单独相对简单,但是当你一次性完成时看起来非常神奇。让我们一个一个地分解它们:

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

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

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

所以,是的,它与视图可以访问的@story相同 - 一个无效且附加了错误信息的那个。

form_for采用多种形式,而您正在使用的形式非常聪明

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

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

这是form_for的一个特殊版本,它可以从传入的对象中推断出各种信息并适当地呈现表单。 @story由于行

而填充了一些字段
@story = params[:story]

在您的控制器中,所以它会继续并为您填写这些字段。它也做了一些其他事情 - 例如,它检查@ story.new_record?看它是否应该使用POST HTTP方法(RESTful create)或PUT方法(RESTful更新)。

总之,要学习很多魔法,但是一旦你做了大魔术就容易理解。祝你好运!