0

我有一个 rails 应用程序,我在其中使用观察者对所有模型数据进行编码。我使用 html 代码对其进行编码。例如Börje's idé变成Börje's idé.

我现在的问题是每当我创建要编辑的表单时。

<%= form_for(resource) do |f| %>
    <%= f.label :name, "Name" %>
    <%= f.text_field :name %>
<% end %>

有没有办法强制 text_field 方法进行一些解析(即通过我的 d() 方法运行它)。

我想要一个不需要修改每个模型和每个表单的解决方案。也许可以覆盖该ActionView::Helpers::FormBuilder.text_field方法?

4

1 回答 1

0

这是我找到的一个解决方案:

# controllers/application_controller.rb
module ActionView
    module Helpers
        class FormBuilder
            alias_method :old_text_field, :text_field

            def d(str)
                return str unless str.is_a? String

                next_str = HTMLEntities.new.decode(str)
                while (next_str != str)
                    str = next_str
                    next_str = HTMLEntities.new.decode(str)
                end
                return next_str
            end

            def text_field(method, options = {})
                @object[method] = d(@object[method])
                return old_text_field(method, options)
            end
        end
    end
end

我猜想instance_method在覆盖的方法中使用和绑定它会通过使 old_text_field 在范围内成​​为本地来清理命名空间。我不知道该怎么做,但如果有人想编辑这个答案并这样做,请随时这样做。

于 2013-06-11T21:23:04.397 回答