2014-01-28 5 views
0

P.S: Я работал с Ruby менее 48 часов, поэтому ожидайте, что я буду глупым!Помощник подтверждения валидации или получение ошибки проверки

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

Так, например, если я попытаюсь создать новую модель пользователя, для которой атрибут «name» установлен на «bob», а имя bob с именем уже существует, я хочу отобразить сообщение типа «Боб недоступен, нажмите здесь, чтобы просмотреть текущую учетную запись bob ».

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

По существу я хочу что-то вроде:

validates_uniqueness_of :text, :message => self.uniquefound() 

def uniquefound() 
    return "some string i can make up myself with #{self.name}'s info in it" 
end 

Нет сомнений, что это совершенно неправильно ...

Если это не возможно, я нашел я могу использовать users.errors.added?, чтобы обнаружить, если имя атрибута имеет уникальную добавленную ошибку, оттуда я могу, вероятно, сделать некоторые манипуляции с хэшем, чтобы удалить уникальную ошибку, а также разместить мой собственный там либо в обратном вызове «after_validation», либо в контроллере ... не разработали точно, как это сделать это, но это мой резервный план.

Таким образом, существует способ предоставления обратного вызова метода класса для класса И, передавая текущую модель этому методу (если это статический метод) или называет его так self внутри этого метода является проверяемой моделью.

Update

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

private 
    def normalize_message(attribute, message, options) 
     case message 
     when Symbol 
     generate_message(attribute, message, options.except(*CALLBACKS_OPTIONS)) 
     when Proc 
     message.call 
     else 
     message 
     end 
    end 
    end 

Итак, если я передать метод как сообщение , я полагаю, что этот метод используется для вызова моей функции/метода и получения возвращаемых данных. Однако кажется, что он не вызывается в области текущего объекта и не проходит в объекте, для которого имеет место ошибка ...

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

ответ

2

Вы можете сделать что-то подобное, если вам действительно нужна эта функциональность.

Class User < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    .... 
    validate :unique_name 


    def unique_name 
    original_user = User.where("LOWER(name) = ?", name.downcase) 
    if original_user 
     message = "#{name} is not available " 
     message << ActionController::Base.helpers.link_to("Click Here",user_path(original_user)) 
     message << "to view the current #{name}'s account." 
     errors.add(:name,message) 
    end 
    end 
end 

EDIT

с Proc объекта вместо

Class User < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    .... 
    validates_uniqueness_of :name, message: Proc.new{|error,attributes| User.non_unique(attributes[:value]) } 


    def self.non_unique(name) 
    original_user = User.where("LOWER(name) = ? ", name.downcase) 
    message = "#{name} is not available " 
    message << ActionController::Base.helpers.link_to("Click Here",Rails.application.routes.url_helpers.user_path(original_user)) 
    message << "to view the current #{name}'s account." 
    end 
end 

Они оба добавить следующее сообщение об ошибке: имя

"Name Bob is not available <a href=\"https://stackoverflow.com/users/10\">Click Here</a>to view the current Bob's account." 
+0

да я даже смотреть на возможности сделать мою собственную уникальную проверку, которая позволила бы мне навсегда мне понравилось сообщение.Думаю, я надеялся на что-то большее, чем обратный вызов. В настоящее время вы пытаетесь выяснить, могу ли я найти сообщение ': took' в сообщениях и заменить его во время' after_validation', но поскольку хэш сообщений является только readbale, я должен использовать любые методы, которые предоставляет класс. Что, вероятно, означает захват всего массива ошибок для атрибута, поиск и удаление значения, совпадающего с ': taken', а затем вставить новое значение – Lee

+0

Хорошо, что он имеет тот же самый точный эффект, но я добавил метод для объекта Proc, который, кажется, подходит и вашим потребностям, и ближе к вашему первоначальному вопросу. – engineersmnky

+0

Ха, я думаю, он имеет тот же эффект, так как он все равно должен запрашивать исходную учетную запись. Но это странно кажется более подходящим способом использования обратного вызова для сообщения, поскольку это то, что я хочу изменить, вместо того, чтобы полностью обрабатывать уникальное ограничение (не то, чтобы оно заканчивалось каким-то другим, так что, может быть, это просто глупо). В любом случае, спасибо за вашу помощь! Угадайте, что я начну поиск в Google и выясню, где указаны два аргумента, поскольку я не мог найти никаких указаний в источнике рельсов, где атрибуты были переданы функции обратного вызова. – Lee

Смежные вопросы