Форматирование номера кредитной карты в number_field_tag ​​[дубликат]

Будьте осторожны при использовании этих обозначений: например. если мы хотим получить доступ к функции, присутствующей в родительском окне окна. В IE:

window['parent']['func']

не эквивалентен

window.['parent.func']

Мы можем либо использовать:

window['parent']['func'] 

, либо

window.parent.func 

для доступа к ней

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

6 ответов

Самое лучшее, что я до сих пор придумал, это примерно так:

<%= 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
ответ дан Luke Francl 27 August 2018 в 02:19
поделиться
  • 1
    Примечание. Если вы используете первое решение с форматом, который добавляет запятые или символы валюты, вам необходимо разбить их в методах создания и обновления вашего контроллера. – LeBleu 20 August 2013 в 21:06
  • 2
    Я бы не стал использовать второе решение, ссылаясь на ApplicationController из вашей модели, определенно не очень хорошо, чтобы привыкнуть делать. – Mark G. 1 May 2015 в 21:06
  • 3
    Последний работал лучше всего для меня, мои функции все еще могут быть в моей модели данных, и это не влияет на представление или редактирование. Хорошее решение! – David J. Davis 29 September 2016 в 15:34

Если вы хотите, чтобы формат был создан или поддерживался во время редактирования, вам нужно будет добавить Javascript для реализации «масок». Вот демонстрация.

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

3
ответ дан Ian Terrell 27 August 2018 в 02:19
поделиться

Я предпочитаю ваш первый ответ, причем форматирование выполняется в представлении. Однако, если вы хотите выполнить форматирование в модели, вы можете использовать методы-обёртки для getter и setter и не использовать полностью значение параметра.

. В итоге вы получите что-то вроде это.

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 покрыл это объектом Time в текстовом поле в эпизоде ​​# 32 . Действительно умная часть этого - то, как они обрабатывают ошибки проверки. Стоит посмотреть эпизод только для этого.

9
ответ дан jdl 27 August 2018 в 02:19
поделиться

Это старый вопрос, но в случае, если кто-нибудь столкнется с этим, вы можете использовать помощники number_to_X. У них есть все атрибуты, которые вы когда-либо могли бы отображать для своего значения:

<%= f.text_field :my_number, :value => number_to_human(f.object.my_number, :separator => '', :unit => '', :delimiter => '', :precision => 0) %>

Также доступно больше атрибутов: http://api.rubyonrails.org/classes/ActionView/ Помощники / NumberHelper.html

4
ответ дан Joshua Harris 27 August 2018 в 02:19
поделиться

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

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 small = дюймы или миллиметры.

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

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

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

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

Наконец has_error обертывает поле в div с ошибкой, если на этой метке есть ошибки.

1
ответ дан Tilendor 27 August 2018 в 02:19
поделиться

Вы можете использовать плагин number_format . Указав number_format для существующего числового атрибута внутри вашей модели, атрибут теперь будет отображаться как форматированный для Rails во всех формах и представлениях. Он также будет анализироваться обратно из этого формата (при назначении через формы) перед вставкой в ​​базу данных. (Плагин также создает чисто числовые 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
ответ дан Tim Cooper 27 August 2018 в 02:19
поделиться
  • 1
    Хорошая идея. Не работает на Rails 3, как я протестировал сегодня. – Cheng 13 November 2012 в 10:09
Другие вопросы по тегам:

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