2

我的 Gemfile 的摘录:

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

对于任何资源,我有 3 个操作(新建、编辑和显示)的 1 个视图。例子:

<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 操作如何将所有字段设置为 disabled ?这很丑陋。
考虑到我无法将视图重构为具有 show.html.erb 文件。

我想做的事:

当操作为#show 时,simple_form 构建器使用自定义构建器,用html 标记替换<input>,和值。<textarea><select><p>

此外,我将自定义单选按钮、复选框。

我的第一步:

# 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

找不到办法。自定义表单构建器或自定义输入(带有猴子补丁)?

感谢您的帮助!

4

1 回答 1

2

这是我的解决方案

在我的 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/inputs/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

未映射的数据类型存在一些问题,但这是另一回事: Can't create Custom inputs for some (Text, Booleans, ...) types, with SimpleForm

于 2011-09-15T18:22:20.347 回答