Gem 又一个轮子 EasyForm: form builder without complex dsl

kikyous · 2015年05月26日 · 最后由 martin91 回复于 2015年05月28日 · 2327 次阅读

EasyForm

Home: https://github.com/kikyous/easy_form

form builder without complex dsl

turn

<%= f.text_field, :title %>

into

<%= f.field :text_field, :title %>

as you see field is a proxy method that send method and args to ActionView::Helpers::FormBuilder instance, so you can write like this: <%= f.field :text_area, :title %>

output:

<div class="large-12 columns">
  <label>* Title
    <input type="text" value="" name="article[title]" id="article_title">
  </label>
</div>

template above:

app/views/easy_form/_default.html.erb

<div class='row'>
  <div class='large-12 columns'>
    <label><%= '*' if required? %> <%= label_text %>
      <%= input %>
    </label>
  </div>
</div>

or you can use a named template:

<%= f.field :text_field, :title, template: 'bootstrap' %>

or globally:

<%= form_for @article, template: 'bootstrap' %>

Install

gem 'easy_form', github: 'kikyous/easy_form'
bundle
rails g easy_form:view

Method and object in template

  • input (input tag generated with rails form builder)
  • field (field, such as :title)
  • label_text (text display as label)
  • required? (this field is required?)
  • builder (rails form builder)

做这个是因为个人感觉 simple_form 的 dsl 复杂而且不好用,经常写不出来我要的结构,感觉是为了快速,省事而把自己带到另外的一堆问题之中,所以在新项目中一直不想用 simple_form

从来就排斥 simple_form。如果用了,就觉得要用起来。

用 simple_form 你可以配一些 custom_wrapper,再不济你还可以写一些 custom component

#3 楼 @hz_qiuyuanxin 我肯定自己写过 wrapper,不过还是遇到很多限制,至于再去写 component,感觉是把问题复杂化了,本来很简单的事情,所以有段时间我宁可 form 代码多一点也不用 simple_form

label
  = t "models.article.title"
  input type="text" name="article[title]"

多余的 class 和 id 一概扔掉

#5 楼 @luikore 有时候需要更多的 tag,比如 foundation 的 form 需要

<div class='row'>
  <div class='large-12 columns'>

#6 楼 @kikyous 但是每个 field 都是不同长度的 column... 这个 gem 重新发明一次 helper 也没什么意思啊

#7 楼 @luikore 不同长度?难道 form 里面的 field 都不对齐的吗?

#8 楼 @kikyous 对齐就一个 each, 也没必要搞一个 partial 啊。难道你所有的 form 都一样长的?

- [:title, :name, :desc].each |f|
  .row
    .large-12.columns
      label
        = t "models.article.#{f}"
        input type="text" name="article[#{f}]"

#9 楼 @luikore 你这样不方便吧,还得用 send 才行,而且这些字段都要在一起,字段少的话可以这么用 我觉得这样的一个解决方案是有需求的,要不然也不会出现 simple_fom 和 Formtastic 了。

努力改进吧,少年,我最喜欢轮子。

#11 楼 @greatghoul 嗯,制造出更好的轮子是我们的使命 :bowtie:

simple_form 之流的 form 实现的确很烂,form 的封装我都是自己实现的。

#13 楼 @gazeldx 嗯,你可以试一下这个,这个也是我在现有的项目中分离出来的,感觉用起来还不错,主要是简单,代码总共就几十行

感觉还不如就直接用 Rails 提供的 FormHelper 呢,不过确实感觉 simple_form 很尴尬,简单场景不需要,复杂场景不灵活。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号