我已在 05:15 的 Go Rails 视频中看到显示的代码: 视频教程
<%= form_with model: Link.new do |form| %>
# ...
<% end %>
通常我会写一个 new-action。类似这样的:
def new
@link = Link.new
end
显然,在调用 form_with 时,可以跳过该操作并动态创建所需的对象。
拥有 new-action 有什么好处?
是否有一条单独的路线,在调用时创建表单?
我已在 05:15 的 Go Rails 视频中看到显示的代码: 视频教程
<%= form_with model: Link.new do |form| %>
# ...
<% end %>
通常我会写一个 new-action。类似这样的:
def new
@link = Link.new
end
显然,在调用 form_with 时,可以跳过该操作并动态创建所需的对象。
拥有 new-action 有什么好处?
是否有一条单独的路线,在调用时创建表单?
严格来说,控制器方法实际上并不是需要的,但它的主要优点是将逻辑放在一个清晰连贯的位置。
视图本身就很混乱,因为它是标记和代码的组合,它实际上应该只关心以最直接的方式将提供的数据转换为 HTML。实例化或查询该数据应该是控制器的责任。
随着复杂程度的增加,这种关注点分离变得越来越重要。但实际上,通过采取稍微长一点的路线,你可以避免在复杂程度增加时重写代码。
除了概念问题之外,还有一些直接的实际原因导致这
<%= form_with model: Link.new do |form| %>
不是一个很好的做法:虽然您可以在视图中使用以下方法处理此问题:
这会将逻辑置于不属于它的视图中。
事实上并非如此,因为无论如何这都是可能的。
即使您没有匹配的控制器动作,轨道也会隐式地寻找视图并渲染它。
这更多的是关于以一种能够很好地适应复杂性并且符合其他 Rails 开发人员期望的方式分离关注点。
本质上 — 是的。如果客户端知道要发出什么样的请求,它就会直接向
create
操作发出请求并传递正确的参数。例如,您create
通过curl
命令行进行测试,或者 REST 客户端发出请求(另一个程序员阅读文档,并知道在请求正文中发送什么 — 无需new
调用)。浏览器是一种“特殊”的客户端,它需要调用
new
才能向用户显示表单。用户根据表单小部件做出选择(在文本输入中输入内容,从选择/单选/复选框中选择选项),然后单击提交,最终以 POST 的形式进入操作create
。该
Link.new
部分不会向您的应用传达您正在创建新对象的信息。它由form_with
助手使用并尝试获取要在表单中显示的数据。(它还使用模型的名称来确定字段名称应该是什么,在您的示例中,字段名称应该是link[attribute_name]
)。因此,传递一个对象(即使是空对象,如 Link.new)对于框架找出正确呈现表单所需的所有细节是必要的。正确呈现的表单意味着在提交时正确执行 POST 请求。通常,没有字段就表明您正在创建新对象
id
。检查您的编辑表单,看看其中是否有隐藏id
字段,或者它位于表单的操作 URL 中。为了更好地理解
Link.new
您的表单,请做一些实验。例如,您可以form_with model: Link.new(foo: "default value")
尝试显示呈现的表单中的字段,:foo
该字段将设置“默认值”。或者您可以SomeDifferentModel.new
比较生成的 HTML 表单。