0

我正在尝试在 Rails 中创建自定义表单构建器来转换此代码

    <div class="row collapse">
      <div class="large-4 columns">
        <%= builder.label :vacancy_title, "Title of the Vacancy", class: "right inline" %>
      </div>
      <div class="large-8 columns">
        <%= builder.text_field :vacancy_title, class: "tiny" %>
      </div>
    </div>

简单到

<%= builder.t_field :vacancies, "Label title" %>

我正在尝试这段代码,但没有运气,它只显示标签。

#form_builders/custom_form_builder.rb
class CustomFormBuilder < ActionView::Helpers::FormBuilder
def t_field(name, title, *args)
   @template.content_tag :div, class: "row collapse" do
     @template.content_tag :div, class: "large-8 columns" do
   text_field_tag(name, *args)
     end

   @template.content_tag :div, class: "large-4 columns" do
     @template.content_tag :h5 do
       label(title, options[:label], class: "right inline")
     end
   end

 end
end

text_field_tag(name, *args) 显然有问题,但我不知道如何声明输入。我在 ruby​​api Helpers::FormBuilder 上找不到任何文档

解决了

感谢 Levi Stanley,我用下面的代码解决了这个问题。我需要更改text_field_tag(name, *args)withtext_field_tag("#{object_name}[#{name}]")label(title, options[:label], class: "right inline")withlabel(name, title, *args, class: "right")以使表单与嵌套属性一起正常工作。

class LabeledFormBuilder < ActionView::Helpers::FormBuilder
  def t_field(name, title, *args)
    @template.content_tag :div, class: "row collapse" do
      (@template.content_tag :div, class: "large-4 columns" do
        @template.content_tag :h5 do
          label(name, title, *args, class: "right")
        end
      end) +
      (@template.content_tag :div, class: "large-8 columns" do
        @template.text_field_tag("#{object_name}[#{name}]")
      end)
    end
  end
end
4

1 回答 1

1

您需要content_tag将内部 div 的 s 连接在一起。content_tag 方法使用块的返回值来确定其内容。您正在运行包含text_field_tag但实际上并未将其包含在外部“行折叠”div 中的 div 的代码,因为它不包含在块的返回值中。

#form_builders/custom_form_builder.rb
class CustomFormBuilder < ActionView::Helpers::FormBuilder
  def t_field(name, title, *args)

    @template.content_tag :div, class: "row collapse" do
      (@template.content_tag :div, class: "large-8 columns" do
        text_field_tag(name, *args)
      end) +

      (@template.content_tag :div, class: "large-4 columns" do
        @template.content_tag :h5 do
          label(title, options[:label], class: "right inline")
        end
      end)
    end
  end
end
于 2013-07-15T22:58:03.043 回答