Ruby on Rails:简单的表单,在每个输入字段旁边添加Image

时间:2012-08-22 11:04:23

标签: html ruby-on-rails ruby simple-form

当我使用rails时,我使用简单的形式gem

创建一个简单的表单

我创建了一个这样的表单

<%= simple_form_for @user do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= f.button :submit %>
<% end %>

但我想在每个字段旁边添加一个默认图像元素。我怎么能实现这个目标?

我试试这个

<%= simple_form_for @user do |f| %>
      <%= f.input :username % >
      <img xxxx>
      <%= f.input :password %>
      <img xxxx>
      <%= f.button :submit %>
      <img xxxx>
    <% end %>

但是我不会工作,因为它会为每个元素字段换行。

3 个答案:

答案 0 :(得分:1)

答案就是这样在app /

中创建一个名为input的文件夹

并使用[any_name] _input.rb创建一个文件,假设您将其命名为image_tag_input.rb

然后image_tag_input.rb中的代码看起来像这样

 class ImageTagInput <  SimpleForm::Inputs::Base
   ## Because image tage doesnot work if not included the below
   include ActionView::Helpers::AssetTagHelper
   def input
    ("#{@builder.text_field(attribute_name, input_html_options)}" + "#{image_tag()}).html_safe
   end
end

然后在html端

这样做

<%= f.input :username,:as => "image_tag %>

此处以及 simple_form_for

wiki中的另一个示例提及

希望这个帮助

答案 1 :(得分:0)

我总是使用Simple Form Bootstrap使用的包装器。

默认包装器中的一个示例:

SimpleForm.setup do |config|
  config.error_notification_class = 'alert alert-danger'
  config.button_class = 'btn btn-default'
  config.boolean_label_class = nil

  # :vertica_from wrapper
  config.wrappers :vertical_form, tag: 'div', class: 'form-group row', error_class: 'has-error' do |b|
    b.use :html5
    b.use :placeholder
    b.optional :maxlength
    b.optional :pattern
    b.optional :min_max
    b.optional :readonly
    b.use :label, class: 'control-label'

    b.use :input, class: 'form-control'
    b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
    b.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
  end


  # Rest omitted

  # Change default simple form wrapper settings
  config.default_wrapper = :vertical_form
  config.wrapper_mappings = {
    check_boxes: :vertical_radio_and_checkboxes,
    radio_buttons: :vertical_radio_and_checkboxes,
    file: :vertical_file_input,
    boolean: :vertical_boolean,
    datetime: :multi_select,
    date: :multi_select,
    time: :multi_select
  }
end

创建简单表单时

<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>

默认情况下(由于设置)将使用:vertical_form

现在,如果您要设置自定义包装器,请按照上面的示例创建自定义类并将其放在config/initializers下。这是一个示例自定义包装器,我在上面添加了Bootstrap设置:

config.wrappers :horizontal_file_input, tag: 'div', class: 'form-group row', error_class: 'has-error' do |b|
    b.use :html5
    b.use :placeholder
    b.optional :maxlength
    b.optional :readonly
    b.wrapper tag: 'div', class: 'col-md-6' do |bb|
      bb.use :label, class: 'col-sm-5 control-label'

      bb.wrapper tag: 'div', class: 'col-sm-7' do |bbb|
        bbb.use :input
        bbb.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
      end
    end

    b.wrapper tag: 'div', class: 'col-md-3 side-validation' do |bc|
      bc.use :error, wrap_with: { tag: 'span', class: 'help-block' }
    end
  end

然后使用此包装器,找到要应用自定义包装器的输入,并执行以下操作:

<%= f.input :resume, as: :attachment_preview, wrapper: :horizontal_file_input %>

轰!它将使用您的自定义设置呈现!此外,您可以将包装器设置为表单以更改其所有输入的默认包装器。所以如果你这样做:

<%= simple_form_for(@staff,  as: :staff,
                             url: staffs_path, 
                             method: "post",
                             wrapper:  :horizontal_form) do |f| %>

然后它的所有输入字段都默认使用:horizontal_form包装器(这也是另一个Simple Form Bootstrap包装器)

希望这有帮助。

答案 2 :(得分:-1)

我建议您使用f.labelf.input_field代替f.input,因为它可以让您根据需要放置组件,并将图片添加到您想要的位置。

查看Simple_Form文档以获取更多信息和示例。

示例:

<%= simple_form_for @user do |f| %>
  <%= f.label :username %>
  <%= f.input_field :username %>
  <img xxxx>
  <%= f.button :submit %>
<% end %>