Подтвердить что ты не робот

Использование помощников проверки правильности Rails: сообщение, но хотите его без указания имени столбца в сообщении

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

Rails 4 ответ

Посмотрел код здесь:

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

Поэтому вы можете указать в файле en.yml:

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

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

Ответ 4

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

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

По существу, в инициализаторе измените метод full_messages в ActiveRecord.Errors, чтобы возвращать полные предложения (not 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 для поддержки этого для усилий по интернационализации.

Ответ 5

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

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

Вы используете его следующим образом:

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

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

Ответ 7

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

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

validates_uniqueness_of: foobar,: message = > "Фообар не уникален".

И затем,

@foo.errors.to_a

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

Ответ 8

В рельсах 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

Ответ 9

У меня тоже была такая же проблема с RoR 3.0.3. Я не смог найти способ отображения сообщений проверки без имени атрибутов. Код, который Swards опубликовал ранее, не работал у меня, но это было хорошее начало.

Я разместил следующий код в файле RB в папках config/initializers:

ActiveModel::Errors.class_eval do
  # Remove complicated logic
  def full_messages
    full_messages = []

    each do |attribute, messages|
      messages = Array.wrap(messages)
      next if messages.empty?

      if attribute == :base
        messages.each {|m| full_messages << m }
      else
        attr_name = attribute.to_s.gsub('.', '_').humanize
        attr_name = @base.class.human_attribute_name(
          attribute,
          :default => attr_name
        )

        options = { :default => "%{message}", :attribute => attr_name }

        messages.each do |m|
          full_messages << I18n.t(:"errors.format", options.merge(:message => m))
        end
      end
    end
    full_messages      
  end 
end 

Это удаляет имя атрибутов из всех сообщений, что именно то, что я хотел сделать.

Ответ 11

Rails 3.2 надежное решение

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

До тех пор вы можете использовать Rails в проекте с помощью запроса на вытягивание:)

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}'

Ответ 12

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

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