在 Rails 上 Ruby 中使用 simple_form 的不同方式 |有什么不同?
Different Ways to use simple_form in Ruby on Rails | What is the difference?
这些处理 "packs" 编辑表单的方法有什么区别?
这些不同的方法如何影响应用程序的稳定性?它的多功能性?
这些运行哪里会成大问题?为什么一个比另一个好?
- 通过"method?"
<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
- 通过对象
<%= simple_form_for @pack, url: pack_path(@pack), method: :patch do |f| %>
- 通过符号
<%= 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])
,但是需要权衡取舍:
不建议在视图代码中调用 ActiveRecord。视图应该只负责布局表单,而不是查询数据库。保持这种分离将使长期维护更加直接。使用变量还意味着您可以为 new
和 edit
屏幕使用相同的表单,方法是在控制器中为 new
视图设置 @pack = Pack.new
。出于这些原因,我建议不要选择 [1].
使用对象 (@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="✓" /><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 只是其基础。
这些处理 "packs" 编辑表单的方法有什么区别?
这些不同的方法如何影响应用程序的稳定性?它的多功能性?
这些运行哪里会成大问题?为什么一个比另一个好?
- 通过"method?"
<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
- 通过对象
<%= simple_form_for @pack, url: pack_path(@pack), method: :patch do |f| %>
- 通过符号
<%= 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])
,但是需要权衡取舍:
不建议在视图代码中调用 ActiveRecord。视图应该只负责布局表单,而不是查询数据库。保持这种分离将使长期维护更加直接。使用变量还意味着您可以为
new
和edit
屏幕使用相同的表单,方法是在控制器中为new
视图设置@pack = Pack.new
。出于这些原因,我建议不要选择 [1].使用对象 (
@pack
) 或符号 (:pack
) 会产生相同的结果,因为在内部 Railsform_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="✓" /><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 只是其基础。