当我们在模型中有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的内部工作原理.
是的,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更新).
总而言之,要学习很多魔法,但是一旦你做了大魔术就会更容易理解.祝好运!