Использование помощников по проверке Rails: сообщение, но оно нужно без указания имени столбца в сообщении - PullRequest
21 голосов
/ 27 марта 2009

Использование помощников проверки Rails-

validates_xxx_of :the_column, :message => "my message"

сгенерирует сообщение проверки:

the_column мое сообщение

Есть ли способ отключить включение имени столбца? (заменить ххх любым вспомогательным методом проверки)

Ответы [ 12 ]

16 голосов
/ 24 ноября 2010

Я знаю, что этот вопрос старый. Но только для справки, на случай, если кто-то другой споткнется об этом, как я только что.

По крайней мере в Rails 3.0.x (не уверен в более ранних версиях) вы можете использовать начальный ^, как указано в RadBrad, без необходимости в каких-либо гемах / плагинах.

7 голосов
/ 03 декабря 2013

Rails 4 ответа

Взглянул на код здесь:

https://github.com/rails/rails/blob/master/activemodel/lib/active_model/errors.rb#L374

Поэтому вы можете установить в своем файле en.yml:

en:
  errors:
    format: '%{message}'

Это означает, что вам нужно также установить полное сообщение об ошибке везде, но я думаю, что это предпочтительнее. Обратите внимание, и я нашел это сбивающим с толку, формат ошибок не находится в пространстве имен ActiveRecord, куда я обычно помещаю остальные сообщения об ошибках.

6 голосов
/ 24 июля 2009

Существует гем сообщения об ошибке клиента, который должен делать то, что вы хотите

https://github.com/jeremydurham/custom-err-msg

Это позволяет вам переопределить нормальную конструкцию сообщения и самостоятельно определить полное сообщение следующим образом:

: message => "^ Ваш адрес электронной почты, кажется, запутался, попробуйте еще раз"

Обратите внимание на символ ^, который говорит рельсам НЕ начинать что-либо, просто используйте сообщение точно так, как определено (за исключением удаления ^)

Если вы не поставите ведущий ^, то получите сообщение об ошибке, сгенерированное обычными рельсами.

3 голосов
/ 08 октября 2009

Это лучшее объяснение, которое я смог найти.

http://adamhooper.com/eng/articles/5

По сути, в инициализаторе измените метод full_messages в ActiveRecord.Errors, чтобы он возвращал полные предложения (не column_name, конкатенации сообщений), если в проверке указан атрибут: message.

Обновление - Если вы попробуете код Адама, вам придется использовать файл свойств en.yml, если нет, он не будет работать должным образом. Вы можете сделать это или обойти это путем дальнейшего изменения метода full_messages. Это работает для меня. Я добавил следующее в инициализатор (/imitializers/active_record_errors.rb)

if RAILS_GEM_VERSION =~ /^2\.3/
  ActiveRecord::Errors.class_eval do
    # Remove complicated logic
    def full_messages
      returning full_messages = [] do
        @errors.each_key do |attr|
          @errors[attr].each do |message|
            next unless message
            if attr == "base"
              full_messages << message
            elsif message =~ /^\^/
              full_messages << $'            #' Grabs the text after the '^'
            else 
              attr_name = @base.class.human_attribute_name(attr)
              full_messages << attr_name + I18n.t('activerecord.errors.format.separator', :default => ' ') + message 
            end  
          end 
        end 
      end 
    end 
  end 
end

Адам также приводит веские аргументы в пользу модификации Rails, чтобы поддержать это в усилиях по интернационализации.

1 голос
/ 01 марта 2014

В рельсах 2 вы можете сделать на своей модели:

validate :test_validation

private

def test_validation
  if error_condition
    errors.add_to_base("Message")
  end
end

В рельсах 3 или больше:

validate :test_validation

private

def test_validation
  if error_condition
    errors[:base] << "Message"
  end
end
1 голос
/ 20 декабря 2010

Почему бы просто не использовать хеш @ object.errors?!

Измените сообщения, как вы в части проверки:

validates_uniqueness_of: foobar,: message => "Foobar не уникален."

А потом,

@foo.errors.to_a

Вы получаете хороший массив, где второй записью является само сообщение об ошибке.

1 голос
/ 18 декабря 2009

ссылка на rubyforge не работает, вот пользовательский плагин сообщения об ошибках на github:

http://github.com/gumayunov/custom-err-msg

1 голос
/ 21 июля 2009

Я сделал так, чтобы переопределить ВСЕ сообщения, а не использовать помощники форм Rails для отображения сообщений об ошибках.

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

Вы используете это так:

validates_uniqueness_of :foobar, :message => "The foobar isn't unique."

Тогда не используйте full_messages при печати сообщения об ошибке.

0 голосов
/ 04 февраля 2016

Вот довольно простая реализация, которая должна сделать свое дело. Примечательно, что он влияет только на одну модель (в отличие от большинства уловок, основанных на локалях) и не слишком сложен .... он просто изменяет один объект:

class Widget < ActiveRecord::Base
  validates_numericality_of :quantity, greater_than: 0, message: "numericality"

  def errors
    super.tap do |e|
      e.extend(FixQuantityErrorMessage)
    end
  end

  module FixQuantityErrorMessage
    def full_message(attribute, message)
      if attribute.to_s == 'quantity' && message == "numericality"
        "You need at least one!"
      else
        super
      end
    end
  end
end
0 голосов
/ 14 сентября 2012

Rails 3.2 будущее решение

Для тех, кто споткнулся здесь (и, возможно, прокрутил до дна), ищущих, как это сделать в более поздних версиях Rails, вот несколько хороших новостей для вас: это будет довольно просто сделать в Rails 4 после этого запрос на добавление объединен. Может потребоваться дополнительная полировка для некоторых сценариев, но здесь достигнут определенный прогресс.

А до тех пор вы можете обезопасить Rails в своем проекте с помощью запроса pull:)

class ActiveModel::Errors
  def full_message(attribute, message)
    return message if attribute == :base
    attr_name = attribute.to_s.tr('.', '_').humanize
    attr_name = @base.class.human_attribute_name(attribute, :default => attr_name)
    I18n.t(:"errors.formats.attributes.#{attribute}", {
      :default   => [:"errors.format","%{attribute} %{message}"],
      :attribute => attr_name,
      :message   => message
    })
  end
end

И добавьте следующее в ваш файл локали:

en:
  errors:
    formats:
      attributes:
        name: '%{message}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...