[英]Different Ways to use simple_form in Ruby on Rails | What is the difference?
这些解决“包”编辑表单的方法有什么区别?
这些不同的方法如何影响应用程序的稳定性? 它的多功能性?
哪些会遇到重大问题? 为什么一个比另一个好?
<%= 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| %>
<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>
<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>
任何信息都会很好,我很想知道!
除了在2.你从实例变量引用模型实例而不是仅仅传递方法调用的返回值之外,基本相同。
最终结果是您获得了绑定到模型实例的表单。 这意味着输入的值属性将包含模型中的值。
事实上,所有这些都会产生相同的结果:
<%
@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无效,它应该在控制器中被捕获得更早。
<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>
这将创建一个“作用域”的表单,而不必将其绑定到特定的模型实例。 举个例子:
<%= 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]"
这意味着它将给出一个params哈希,就像我们有一个模型实例一样:
{
thing: {
name: "foo"
}
}
这不是常用的(至少不正确),因为大多数时候你操作模型实例但它确实在搜索表单等特殊情况下使用。
请注意,Rails将尝试解析局部变量@thing
但如果它是nil则不会引发错误。 因此,通常不建议使用此表格,因为它可以掩盖错误。
理解这种行为的最好方法是阅读ActionView :: FormHelpers的文档,其中SimpleForm只是糖的基础。
所有这三种方法都会产生相同的形式(假设您将@pack
设置为Pack.find(params[:id])
,但是需要权衡:
建议您在视图代码中调用ActiveRecord。 视图应该只负责布局表单,而不是查询数据库。 保持这种分离将使长期维护更加直接。 使用变量也意味着你可以有两个相同的形式new
和edit
屏幕,通过设置@pack = Pack.new
在控制器的new
观点。 出于这些原因,我建议不要选择[1]。
使用对象( @pack
)或符号( :pack
)会产生相同的结果,因为Rails form_for
帮助程序在内部使用符号来查找变量。 恕我直言选项[2]并直接引用对象是“更好”,因为没有更多的魔法,所以对项目新手(或一年的时间)的人来说更容易理解。 选项[2]也与Rails文档和SimpleForm文档一致,因此人们看到它并不令人惊讶。
如果你在你的控制器中执行@pack = Pack.find(params[:id])
(并且通常建议使用它@pack = Pack.find(params[:id])
,则1和2是相同的。
3是你不做的事情,因为simple_form_for
期望一个对象作为第一个参数而不是一个符号(你可能会把它与form.input :name
这样的东西混淆)。 我建议你阅读gem的自述文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.