当我们在模型中具有validate_presence_of:name时,然后当我们重新渲染'new'的创建动作时,form_for将填充字段,而error_messages_for'story'将具有正确的错误消息。
这真的很棒,并且同时看起来像魔术……我发现很多书都没有解释魔术是如何发生的。是由某个全局变量决定的吗?
当调用form_for ...时,是否使用从@ story.save返回的@story,而不是新动作中的@story = Story.new?因此,如果我对form_for使用:story,则错误时不会填充字段?
有时我觉得我在使用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创建)或PUT方法(RESTful更新)。
总而言之,有很多小的魔术要学习,但是一旦您完成了大魔术,就更容易理解了。祝好运!
关于ruby-on-rails - 在Rails上,form_for和validate_presence_of如何协同工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/908933/