My Controller
class MessagesController < ApplicationController
def index
@messages = Message.all
end
def new
@message = Message.new
end
def create
@message = Message.new(message_params)
if @message.save
redirect_to '/messages'
else
render 'new'
end
end
private
def message_params
params.require(:message).permit(:content)
end
end
我对应的视图
<div class="create">
<div class="container">
<%= form_for(@message) do |f| %>
<div class="field">
<%= f.label :message %><br>
<%= f.text_area :content %>
</div>
<div class="actions">
<%= f.submit "Create" %>
</div>
<% end %>
</div>
</div>
我对Rails对象创建的底层工作原理有点困惑。目前正在做Codecademy教程,但他们跳过了几个解释步骤。
当表单提交按钮被按下时,是否生成
f.submit
一个JSON对象在POST请求?在被路由到消息控制器的创建操作之后。@message。保存是否保存成功?它不就是一个由传入的参数填充的对象吗?它是否在控制器之前先路由到DB ?
您可以在rails服务器日志中看到表单提交所提交的内容。只需在终端中运行rails server
,打开本地主机,提交表单并立即检查终端中吐出的内容。您可能会得到这样的内容:
Started POST "/messages" for ::1 at 2021-10-25 11:41:33 +0200
Processing by MessagesController#create as HTML Parameters: {"message"=>"text", "content"=>"hey"}
[here you will see the SQL run to INSERT new data into the database]
Completed 201 Created in 1ms (ActiveRecord: 2.0ms | Allocations: 2073)
分解后,你会得到5条信息。
- 带有时间戳的请求和端点类型
- 使用的控制器和格式
- JSON中的参数
- SQL查询运行
- 响应状态,包含响应中使用的部件的基准,查询花费的时间,渲染花费的时间等。
save
方法从rails将尝试保存一个初始化模型的实例到数据库中,并将返回true或false取决于动作的结果。还有一个save!
方法,如果操作失败,它将引发一个错误,而不是简单地返回假布尔值。所以具体地回答你的问题:
- JSON对象在POST请求的参数中发送,基于HTML表单生成。
- @message是一个由params填充的对象(在您的例子中,它只是实际使用的内容参数)。使用
save
将提示ActiveRecord连接到数据库并执行INSERT操作,将其保存到数据库中。 - 它不首先路由到DB,控制器根据请求控制执行的操作。如果有东西碰到数据库,你必须提示它,就像你用save方法做的那样。
rails文档中的save方法