关于 rails 自带的表单辅助方法是必要的吗?它最后提供给浏览器的不也是 html 文件吗?这样的话,是不是可以直接使用 html+css 来设计页面? 虽然存在就必有此道理,但我不理解。求指点迷津
有必要的,其实手拼表单的 HTML 不是不可以,但是表单通常和模型一一对应的,这时候暴露手拼 HTML 的不足,不能很好的映射模型的“状态”
其实这件事,你裸写一个 HTML,再对比一下利用 Form helper 的代码就好了。
另外,用 Ruby 方法代替手写 HTML 的好处是,可以通过 Ruby 的方法(就是指 Rails 或者你自己写的 helper 方法),屏蔽细节,比如为表单字段的控件(input 标签)引入外部的包装(wrapper html)
ActionView::Helpers
里面这么写的
Form helpers are designed to make working with resources much easier compared to using vanilla HTML.
rails 在做数据库的操作的时候,有很多约定。比如 User.find(1).update(name: "bar")
就直接做了更新。那生成的代码,就要符合这样的约定。
多数时候,更新和创建我们会使用类似的 form,只是 url 和 request method 不同。我们可以判断,要更新的对象是不是 new_record?
来生成对应的代码。
这个时候,你会发现手写,就要处理一些逻辑上的问题,那么引入 helper 就是一个不错的选择。
其实这个时候,还不算有趣。如果 user 有很多 (has_many) books 呢?如果想要在一个表单做 books 的操作呢?
可以这么搞,Book.new.book_attributes = [:name => "Ruby"]
(之前要声明 accepts_nested_attributes_for :book
) 。
这个时候,如果我们想用这个约定,就要构建对应的 form,要根据 nested 的关系构建对对应的 input 的字段。books 还是有序的。等等一系列的操作,但 form_helper 都帮我们搞定了。
到现在,其实已经没有不用 form helper 的理由了。但 rails 没有止步于此。rails 用继承的方式,避免了代码上的重复 -- FormBuilder
。
我们看下面的代码
<%= form_for(@company) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
多数的 input 前是要放 label,有一天,我们不想在写这样重复的代码,怎么办? FormBuilder
!
可以这样搞
class LabellingFormBuilder < ActionView::Helpers::FormBuilder
(field_helpers - [:label, :check_box, :radio_button, :fields_for, :hidden_field, :file_field]).each do |selector|
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
def #{selector}(method, options = {}) # def text_field(method, options = {})
@template.send("label", @object_name, method) +
@template.send( #{selector.inspect}, @object_name, method, objectify_options(options))
end
RUBY_EVAL
end
end
<%= form_for(@company, builder: LabellingFormBuilder) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
具体可以看看这篇文章 https://segmentfault.com/a/1190000004425543 (只有一,没有二、三。。。)
很多 ruby 程序员,说 simple_form 不好用。
但 simple_form 是大大的简化了代码。怎么搞呢,直接 custom 一个 form_builder 来,然后,大家套用这个 builder 就可以了。
custom 一个 form_builder 难不难呢?我们优秀的前端小伙 zack,第一次玩,就 custom 出来了一个。
先说,这是一个非常好的问题。
除了这些便利无法享受到以外。项目中的每一个人,每一个 form,都要重头写 form!都要了解 rails 的细节,都要了解 HTML form 的细节(笔记 array 在 rails 里生成的参数是什么样的?)。
代码变得不可 review -> 错误不好发现 -> 隐藏的 bug。
Rails 复杂,就是因为 Rails 提供了很多这样的便利。
有的时候,难免会想,这些到底值不值得?
accepts_nested_attributes_for
我第一次用,也是一脸懵逼。但我花了一天左右的时候,就搞差不多了,顺带还知道 Rails 的很多细节,比如 create、update 几个方法的关系。影响了我后今后的编码生涯(虽然听着很夸张,但却是如此)。以后 form 可以用的很爽。
搞了这么多,做起来难不难?不难,就像 simple_from,我们前端的小哥,半天就定制好了!Rails 难的时候,可能是你用它的姿势不对。
框架,不但能提供了好用的方法,能解决常见的问题。
还封装了细节,让我们不那么懂的时候,可以写出东西来。
提供了解决问题的姿势,大家可以用一样分流程解决类似的问题。
用 Rails,不能写完业务就万事大吉,还要读文档,了解 Rails 的机制。
我的同事也问过我为啥一定要用 form_for。我说我们是用 Rails 的,不是写 php 的,既然用了,就试着写出 rails stype 的东西吧。
activerecord 也是拼接 sql mina 等部署工具 是拼接 ssh 命令 都是为了简化操作用的 想想你在代码直接写 sql 是个什么感觉