Как написать собственный SimpleForm Builder вместо <INPUT>на <P>? - PullRequest
1 голос
/ 14 сентября 2011

Извлечение моего Gemfile:

gem 'rails', '3.0.3'
gem 'inherited_resources', '1.2.1'
gem 'simple_form', '1.4.0'

Для любого ресурса у меня есть 1 просмотр для 3 действий (новый, редактировать и показывать).Пример:

<h1><%= I18n.t('admin.form.'+action_name.downcase, :name => controller_friendly_name) %></h1>
<%= simple_form_for([:admin, resource]) do |f| %>
  <%= render "admin/shared/errors" %>
  <%= f.input :title, 
  :label => "Title", 
  :hint => I18n.t('admin.form.input.title.hint', :name => controller_friendly_name), 
  :required => true,
  :error => false,
  :input_html => { :class => :large, :placeholder => I18n.t('admin.form.input.title.placeholder', :name => controller_friendly_name) }
  %>
  <%= f.input :is_visible, 
  :as => :radio, 
  :label => "Visible", 
  :error => false, 
  :required => true, 
  :collection => [['Yes', true], ['No', false]],
  :wrapper_class => 'checkboxes-and-radiobuttons', 
  :checked => true
  %>
  <%= render "admin/shared/validation", :f => f %>
<% end %>

<% init_javascript "MyApplication.Form.disable();" if [:show].include?(action_name.to_sym) %>

Посмотрите, как действие #show отключило все поля?Это уродливо.
Учтите, что я не могу реорганизовать представления, чтобы получить файл show.html.erb.

Что я хочу сделать:

Когда действие #show,Конструктор simple_form использует пользовательский конструктор, который заменяет тег * <input>, <textarea>, <select> на <p> html со значением.

Кроме того, я буду настраивать радиокнопки, флажки для.

Мой первый шаг:

# app/inputs/showvalue_input.rb
class ShowvalueInput < SimpleForm::Inputs::Base
  def input
    # how to change 'text_field' by <p> container ?
    @builder.text_field(attribute_name, input_html_options)
  end
end

Не могу найти способ сделать это.Пользовательские конструкторы форм или пользовательские входы (с патчами для обезьян)?

Спасибо за помощь!

1 Ответ

2 голосов
/ 15 сентября 2011

Вот мое решение

в моем application_helper.rb:

    def set_show_method_to_builder(builder)
      builder.instance_eval <<-EVAL
        def show?
          #{action_name == "show"}
        end
  EVAL
    end

В моих формах (в блоке simple_form):

<%- set_show_method_to_builder(f) -%>

И, наконец, в# app / input / string_input.rb:

class StringInput < SimpleForm::Inputs::StringInput
  def input
    if @builder.show?
      content_tag(:p, @builder.object[attribute_name], :class => :show)
    else
      super
    end
  end
end

Существует некоторая проблема с типами данных, которые не отображаются, но это другая история: Не удается создать пользовательские входы для некоторых (Text, Booleans, ...) типов, с SimpleForm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...