这些不同的方法如何影响应用程序的稳定性?它的多功能性?
哪些会遇到重大问题?为什么一个比另一个好?
>通过“方法?” <%= simple_form_for Pack.find(params [:id]),方法:: patch do | f | %GT;
> Via Object<%= simple_form_for @pack,url:pack_path(@pack),方法:: patch do | f | %GT;
>通过符号<%= simple_form_for:pack,url:pack_path(@pack),方法:: patch do | f | %GT;
任何信息都会很好,我很想知道!
除了在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无效,它应该在控制器中被捕获得更早.
3.使用符号调用表单助手:
<%= 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只是糖的基础.