Как я могу отформатировать значение, показанное в, направляющие редактируют поле?

Если вы хотите извлечь содержимое узла Element, используйте метод getTextContent(). Если вам действительно нужна или нужна разметка раздела CDATA, вам потребуется сериализовать этот узел с помощью LSSerializer или аналогичного:

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        docFactory.setNamespaceAware(true);
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();   

        Document doc = docBuilder.parse(new File("doc1.xml"));

        Element content = (Element)doc.getElementsByTagNameNS("http://comResponse.engine/response", "content").item(0);
        if (content != null)
        {
            System.out.println(content.getTextContent());
            LSSerializer ser = ((DOMImplementationLS)doc.getImplementation()).createLSSerializer();
            if (content.getFirstChild() != null)
            {
              System.out.println(ser.writeToString(content.getFirstChild()));
            }

        }

. Это теория, для меня выходы Java JRE 1.8 <![CDATA[<explanation></explanation> без закрывающая разметка для секции CDATA, похоже, что LSSerializer работает некорректно с одним узлом секции CDATA.

31
задан Luke Francl 26 February 2009 в 18:59
поделиться

5 ответов

Лучшее, которое я придумал до сих пор, является чем-то вроде этого:

<%= f.text_field :my_attribute, :value => number_with_precision(f.object.my_attribute) %>

Или my_attribute мог возвратить отформатированное значение, как это:

def my_attribute
  ApplicationController.helpers.number_with_precision(read_attribute(:my_attribute))
end

, Но все еще необходимо использовать :value

<%= f.text_field :my_attribute, :value => f.object.my_attribute %>

, Это походит на большую работу.

38
ответ дан 27 November 2019 в 22:13
поделиться

Я предпочитаю Ваш первый ответ, при этом форматирование сделано в представлении. Однако, если Вы хотите выполнить форматирование в модели, можно использовать методы обертки для метода get и метода set, и избежать необходимости использовать: опция значения полностью.

Вы закончили бы с чем-то вроде этого.

def my_attribute_string
  foo_formatter(myattribute)
end

def my_attribute_string=(s)
  # Parse "s" or do whatever you need to with it, then set your real attribute.
end

<%= f.text_field :my_attribute_string %>

Railscasts покрыл это объектом Времени в text_field в эпизод № 32 . Действительно умная часть этого - то, как они обрабатывают ошибки проверки. Стоит наблюдать эпизод за этим одним.

9
ответ дан 27 November 2019 в 22:13
поделиться

Если Вы захотите, чтобы формат создавался или сохранялся во время редактирования, то необходимо будет добавить JavaScript для реализации "масок". Вот демонстрация.

Это был первый хит в эти результаты .

3
ответ дан 27 November 2019 в 22:13
поделиться

Можно использовать плагин number_format. Путем определения number_format для существующего числового атрибута в модели, атрибут теперь появится, как отформатировано к направляющим во всех формах и представлениях. Это будет также проанализировано назад от того формата (при присвоении через формы) до вставки в базу данных. (Плагин также создает чисто числовой unformatted_<attribute-name> средства доступа, которые могут продолжить использоваться для арифметики, или для прямого числового присвоения или извлечения Вами для бесшовной интеграции.)

class MyModel < ActiveRecord::Base
  # this model has the balance attribute, which we
  #  want to display using formatting in views,
  #  although it is stored as a numeric in the database
  number_format :balance, 
                :precision => 2,
                :delimiter => ',',
                :strip_trailing_zeros => false

  def increment_balance
    unformatted_balance += 10
  end

можно также объединить вышеупомянутое с решением JavaScript, которое может вынудить пользователя поддержать десятичную точку и тысячи разделителей на месте при редактировании, хотя это действительно не необходимо.

3
ответ дан 27 November 2019 в 22:13
поделиться

Я сделал что-то подобное. Мы форматируем времена и длины с помощью пользовательского конструктора форм. Это использует существующий text_field, но обертывает его так, значение может быть настроено:

class SuperFormBuilder < ActionView::Helpers::FormBuilder
  include ApplicationHelper
  include FormHelper
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::FormTagHelper

  def length_field(label,*args)
    scale = 'medium'
    args.each do |v|
      if v.has_key?(:scale)
        scale = v[:scale]
        v.delete(:scale)
      end
    end
  value = length_conversion(@object.send(label.to_sym),scale)
  options = (args.length > 0) ? args.pop : {}
  return has_error(label, text_field_tag(field_name(label),value,*args) + ' ' +  length_unit(scale))
end

private
def field_name(label)
  return @object_name + "[#{label}]"
end

def has_error(label, output)
  return    "<div class='fieldWithErrors'>#{output}</div>" if @object.errors[label]
  return output
end

И это используется как это:

<%= form_for( @section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %> 
   <%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small'  %>
<% end %>

конечным результатом является значение в соответствующей единице, базирующейся от их выбора на системе (Метрика, империал) и IE масштаба, маленький = дюймы или миллиметры.

я в основном скопировал text_field метод с существующего конструктора форм, который использует сам text_field_tag.

существует два глюка: 1) Знание названия поля объекта и как получить доступ к объекту получить значение, которое Вы хотите отформатировать. 2) Разбирание в имени поэтому, когда форма отправлена, это - часть корректного хеша параметрических усилителей.

конструктору форм дают переменную класса @object. Можно получить значение поля с помощью .send метода. В моем случае я отправляю маркировку: feed_size_min_w к @object и возвращают его длину. Я тогда преобразовываю его в свой нужный формат и даю его text_field_tag.

название поля является ключевым для наличия, оно заканчивается в хеше параметрических усилителей в моем экземпляре параметрические усилители [: разделы] один. Я сделал немного функции помощника названным field_name, который заботится об этом.

Наконец has_error обертывает поле в ошибочное отделение, если существуют ошибки на той маркировке.

1
ответ дан 27 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: