Rails表单提交生成对象的底层运行机制相关问题
问题1解答
不会。你当前代码里的form_for用的是Rails默认配置,生成的是标准HTML表单,提交时默认使用application/x-www-form-urlencoded格式封装表单字段数据,不是JSON格式。f.submit本质只是渲染一个<input type="submit">的提交按钮,本身不负责生成请求体内容,请求体是由整个表单内的所有字段组装而成。只有你给form_for额外指定format: :json或者添加remote: true参数走AJAX异步提交时,才会返回JSON格式的请求数据。
问题2解答
@message.save是ActiveRecord封装的实例方法,判断保存成功的逻辑和执行顺序如下:
- 第一步先执行你在
Message模型中定义的所有校验规则(比如你可能加了validates :content, presence: true要求内容不能为空,只是没贴出模型代码),如果任意校验不通过,直接返回false,不会和数据库产生交互 - 校验全部通过后,Rails会生成对应的INSERT SQL语句,发送给数据库执行
- 数据库执行INSERT操作成功就返回
true,如果执行失败(比如触发了数据库层面的唯一索引约束、字段长度限制等)就返回false
你理解的没错,调用save方法之前@message确实只是内存中填充了参数的普通对象,save方法会同步完成校验、数据库交互全流程,拿到最终执行结果的布尔值后,才会进入后面if判断的分支逻辑,也就是确实先完成数据库交互才会走后续的重定向或者渲染逻辑。
内容的提问来源于stack exchange,提问作者LubyRong
相关产品推荐
相关产品推荐

