Рамка Phoenix - проверка пользовательских изменений

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

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

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

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

Ответ 1

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

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 являются допустимыми числами.