2016-02-07 3 views
11

Я действительно новичок в фениксе и эликсире, поэтому извиняюсь, если это похоже на простые вопросы. Я искал переполнение стека и блоги, прежде чем я подумал о размещении его здесь.Phoenix framework - Пользовательские изменения валидации

У меня есть 2 поля в модели, поле A: целое и поле B: целое. Выполняя мои проверки с помощью моего набора изменений, я хочу создать специальную проверку, которая проверяет, является ли поле А больше поля b при создании нового элемента, и если это так, запустите сообщение об ошибке и верните их на новый маршрут. Извините, если я не использую правильные термины.

Так что я думаю, что теперь это вопрос 2 части. Во-первых, должен ли я делать это в своей модели, создавая специальную проверку или это должно быть в контроллере? И во-вторых, какой самый простой способ написать это в phoenix?

Еще раз спасибо.

+0

Похоже, что сравнение было бы лучше всего обработать с помощью специальной проверки. На ваши вопросы, вероятно, лучше всего ответить в документах: http://www.phoenixframework.org/docs/ecto-models – errata

+0

Я думаю, что на ваш ответ правильно ответил, но это скорее вопрос Ecto/Elixir, который есть у Phoenix one I верить. –

ответ

18

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

def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    |> validate_a_less_eq_b 
end 

defp validate_a_less_eq_b(changeset) do 
    a = get_field(changeset, :a) 
    b = get_field(changeset, :b) 

    validate_a_less_eq_b(changeset, a, b) 
end 
defp validate_a_less_eq_b(changeset, a, b) when a > b do 
    add_error(changeset, :max, "'A' cannot be more than 'B'") 
end 
defp validate_a_less_eq_b(changeset, _, _), do: changeset 

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