在 Rails 上 Ruby 中使用 simple_form 的不同方式 |有什么不同?

Different Ways to use simple_form in Ruby on Rails | What is the difference?

这些处理 "packs" 编辑表单的方法有什么区别?

这些不同的方法如何影响应用程序的稳定性?它的多功能性?

这些运行哪里会成大问题?为什么一个比另一个好?

  1. 通过"method?"<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
  2. 通过对象 <%= simple_form_for @pack, url: pack_path(@pack), method: :patch do |f| %>
  3. 通过符号<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>

任何信息都很好,我很想知道!

如果您在控制器中执行 @pack = Pack.find(params[:id]),则 1 和 2 是相同的(通常建议这样做)。

3 是你不需要做的事情,因为 simple_form_for 期望一个对象作为第一个参数而不是一个符号(你可能会将它与 form.input :name 之类的东西混淆)。我建议您阅读 gem 的自述文件。

所有这三种方法都会产生相同的形式(假设您将 @pack 设置为 Pack.find(params[:id]),但是需要权衡取舍:

  1. 不建议在视图代码中调用 ActiveRecord。视图应该只负责布局表单,而不是查询数据库。保持这种分离将使长期维护更加直接。使用变量还意味着您可以为 newedit 屏幕使用相同的表单,方法是在控制器中为 new 视图设置 @pack = Pack.new。出于这些原因,我建议不要选择 [1].

  2. 使用对象 (@pack) 或符号 (:pack) 会产生相同的结果,因为在内部 Rails form_for 助手使用查找变量的符号。恕我直言,选项 [2] 和直接引用对象是 "better",因为魔法较少,所以项目新手(或一年后的您)更容易理解。选项 [2] 也与 Rails docs 和 SimpleForm 文档一致,因此人们看到它也就不足为奇了。

1。和 2. - 将表单助手绑定到模型实例

除了在 2. 中从实例变量引用模型实例而不是仅仅传递方法调用的 return 值之外,它们基本相同。

最终结果是您获得了一个绑定到模型实例的表单。这意味着输入的值属性将包含模型中的值。

事实上所有这些都会给出相同的结果:

<% 
  @pack = Pack.find(params[:id]) 
  pack = Pack.find(params[:id]) 

%>

<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
<%= simple_form_for @pack |f| %>
<%= simple_form_for pack |f| %>

但第一个不太理想,因为您应该避免直接从视图进行查询。视图应该从控制器接收数据并使用它来创建 HTML 并且尽可能简单和声明。另一个主要问题是 .find 将引发 ActiveRecord::RecordNotFoundError 如果 id 无效,这应该更早地在控制器中被捕获。

3。使用符号调用表单助手:

<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>

这将创建一个 "scoped" 的表单,而不必绑定到特定的模型实例。举个例子:

<%= simple_form_for :thing do  |f| %>
  <%= f.input :name %>
<% end %>

这会生成以下 HTML:

<form novalidate="novalidate" class="simple_form thing" action="/things/new" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="F4r1gLuboZc1CKIdn9qac0sefxSVIvkjxk9KsD+sRl1wnVtEIKzHvWY0mPuLPvHI1Kcv3TIWD883YXHKXA+yJQ==" />
  <div class="input string required thing_name">
    <label class="string required" for="thing_name"><abbr title="required">*</abbr> Name</label>
    <input class="string required" type="text" name="thing[name]" id="thing_name" />
  </div>
</form>

注意 name="thing[name]" 这意味着它将给出一个参数散列,就像我们有一个模型实例一样:

{
   thing: {
     name: "foo"
   }
}

这并不常用(至少不正确),因为大多数时候您都在操纵模型实例,但它在搜索表单等特殊情况下确实有用。

请注意 Rails 将尝试解析局部变量 @thing 但如果它为 nil 则不会引发错误。因此通常不建议使用此表单,因为它可以掩盖错误。

了解此行为的最佳方法是阅读 ActionView::FormHelpers 的文档,其中 SimpleForm 只是其基础。