2016-08-16 1 views
1

У меня есть форма, которая принимает входные данные для модели Bill. Форма имеет автозаполнение, которое дает вам слова из динамического массива, созданного в модели Transactions. Я хочу сделать валидацию, которая разрешает только слова из массива в качестве входных данных. Я нашел validation validates_inclusion_of, но я не уверен, что это правильная проверка и как связать проверку в модели, чтобы проверить массив, созданный для автозаполнения.Проверка правильности Rails только в том случае, если вход соответствует строке из динамического массива

Маршрут в моем контроллере транзакций autocomplete_names

Как я могу сделать проверку проверить вход на маршрут в моем контроллере Транзакции.

Вот подтверждение, которое у меня есть до сих пор, или я использую это в неправильном контексте и вам нужно сделать специальную проверку?

validates_inclusion_of :my_bill, in: [Transaction::autocomplete_names], :allow_blank => true, message: "Bill name not found in your account, please try again" 

Это неправильно и не работает, поэтому мне нужно, чтобы выяснить, что поставить в «: в» для этой проверки

+0

Какую версию Rails вы используете? – Okomikeruko

+0

Я использую Rails 4.0.10 – SupremeA

+0

Когда вы вводите 'Transaction :: autocomplete_names' в свою консоль Rails, каков вывод? – Okomikeruko

ответ

3

Обновленный Ответ

Вы можете написать в вашей модели сделки:

def self.autocompete_names 
    Transaction.all.pluck(:trans_name) 
end 

Тогда в вашей модели Билл, вы можете использовать следующую проверку:

Поскольку вы являетесь нами Rails 4, я считаю, что вышеуказанная структура для проверки более актуальна.

1

Создать метод класса в Transaction, который будет возвращать массив имен. Затем вызовите этот метод в validates_inclusion_of.

Добавить метод класса, который должен выглядеть примерно так

def self.autocomplete_names 
    # return an array of words matching bills associated with the user's account 
end 

А затем воспользоваться этим в проверке.

validates_inclusion_of :my_bill, in: Transaction.autocomplete_names 

Из документации,

The: allow_blank вариант похож на: allow_nil вариант. Этот параметр позволяет пройти проверку, если значение атрибута пуст ?, например, nil или пустая строка.

Извлечь опцию allow_blank из проверки. Ваша проверка должна выглядеть

validates_inclusion_of :my_bill, in: Transaction.autocomplete_names, message: "Bill name not found in your account, please try again" 
0

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

Здесь вам нужен метод внутри вашего класса Transaction, который вернет массив строк, на котором вы хотите проверить включение my_bill.Что-то вроде этого:

class Transaction 
    def self.autocomplete_names 
    # return that array of strings 
    end 
end 

и внутри Bill вам нужно изменить ваши проверки как:

class Bill 
    validates_inclusion_of :my_bill, 
         in: -> { Transaction::autocomplete_names }, 
         allow_blank: true, 
         message: "Bill name not found in your account, please try again" 
end 

Пожалуйста, обратите внимание на использовании лямбды -> внутри проверки. Если вы его не используете, массив строк будет оцениваться только во время определения класса. Но вы хотите, чтобы фактические данные из базы данных выполнялись каждый раз при выполнении этой проверки. Значит, это должен быть лямбда. Не уверен в синтаксисе. Пожалуйста, попробуйте.

Вы также можете отказаться от части allow_blank, если вы не хотите, чтобы пустые значения сохранялись в базе данных для my_bill.