代码之家  ›  专栏  ›  技术社区  ›  cluster1

采取独立的新行动的好处是什么?

  •  1
  • cluster1  · 技术社区  · 5 月前

    我在05:15看到了这个Go Rails视频中显示的代码: Video-tutorial

    <%= form_with model: Link.new do |form| %>
        # ...
    <% end %>
    

    通常我会写一个新的动作。类似于:

    def new
      @link = Link.new
    end
    

    显然,在调用form_with时,可以跳过该操作并动态创建所需的对象。

    采取新行动有什么好处?

    它是否用于在调用时创建表单的单独路由?

    2 回复  |  直到 5 月前
        1
  •  1
  •   max Mike Williams    5 月前

    严格来说,控制器方法实际上并不需要,但它的主要优点是它将逻辑放在一个清晰连贯的地方。

    这种视图本质上是混乱的,因为它是标记和代码的组合,它应该只关心以最直接的方式将提供的数据转换为HTML。发布或查询该数据应由控制器负责。

    随着复杂性的增加,这种关注点的分离变得更加重要。但实际上,通过走更长的路,你可以避免在复杂性增加时重写代码。

    除了概念问题,还有直接的实际原因 <%= form_with model: Link.new do |form| %> 这不是一个很好的做法:

    • 它不必要地限制了代码的再悬浮潜力。如果将模型实例传递给视图,则可以轻松地使用相同的代码进行创建和更新。
    • 您没有将用户输入绑定到模型实例,因此用户键入的任何内容都将在表单提交失败时丢失。这不是很好。
    • 这不是脚手架的工作方式,因此令人惊讶。

    虽然您可以通过以下方式在视图中处理此问题:

    <%= form_with model: @link || Link.new do |form| %>
        # ...
    <% end %>
    

    这是把逻辑放在它不属于的地方。

    它是否用于在调用时创建表单的单独路由?

    其实不然,反正也不可能。

    即使您没有匹配的控制器,操作轨道也会隐式地查找视图并渲染它。

    它更多的是以一种能够很好地适应复杂性的方式分离关注点,这也是其他Rails开发人员所期望的。

        2
  •  0
  •   Greg    5 月前

    它是否用于在调用时创建表单的单独路由?

    基本上是的。如果客户端知道要提出什么样的请求,它只需直接向 create 动作并传递正确的参数。例如,您正在进行测试 创造 通过 curl 在命令行中,或者在发出请求的REST客户端中(另一个程序员阅读文档,知道在请求正文中发送什么) new 需要通话)。

    浏览器是一种特殊的客户端,它需要调用 这样它就可以向用户显示表单。他们根据表单小部件做出选择(在文本输入中键入内容,从selects/radio/复选框中选择选项),然后单击提交,这最终会成为一个POST,落在 创造 行动。

    这个 Link.new 部分无法向您的应用程序传达您正在创建新对象的信息。它被使用 form_with help并尝试获取数据以在表单中显示。(它还使用模型的名称来计算字段名称应该是什么,在您的示例中,字段将是 link[attribute_name] ). 因此,传递一个对象(即使是空的对象,如Link.new)对于框架来说是必要的,以弄清楚正确呈现表单所需的所有细节。正确呈现的表单意味着在提交时正确执行POST请求。

    通常,您正在创建新对象的事实是通过以下事实传达的: id 现场。检查您的编辑表单,查看是否有隐藏的 身份证件 字段在那里,或者它在表单的操作URL中。

    为了更好地理解 链接.new 以你的形式做一些实验。例如,你可以 form_with model: Link.new(foo: "default value") 而渲染的形式会试图显示字段 :foo 它将设置一个默认值。或者你也可以 SomeDifferentModel.new 并比较得到的HTML表单。