У меня есть две модели, User
и Profile
, и форма для нового пользователя, у которой есть inputs_for
для поля имени пользователя профиля.
Вот код для них:
пользователь ->
defmodule MyApp.User do
use MyApp.Web, :model
schema "users" do
field :email, :string
field :password, :string, virtual: true
field :crypted_password, :string
has_one :profile, MyApp.Profile
timestamps
end
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(email password), ~w())
|> validate_length(:email, min: 5, max: 240)
|> validate_format(:email, ~r/\w+\@\w+\.\w+/)
|> unique_constraint(:email)
|> validate_confirmation(:password)
|> validate_length(:password, min: 8, max: 240)
end
end
профиль ->
defmodule MyApp.Profile do
use MyApp.Web, :model
schema "profiles" do
field :username, :string
belongs_to :user, MyApp.User, foreign_key: :user_id
timestamps
end
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(username), ~w())
|> validate_length(:username, min: 4, max: 240)
|> unique_constraint(:username)
end
end
код метода создания контроллера ->
def create(conn, %{"user" => user_params}) do
profile_changeset = Profile.changeset(%Profile{}, user_params["profile"])
user_changeset = User.changeset(%User{profile: profile_changeset}, user_params)
case Repo.insert(user_changeset) do
{:ok, _changeset} ->
redirect conn, to: main_page_path(conn, :index)
{:error, changeset} ->
render conn, "new.html", user_changeset: changeset
end
end
Может ли кто-нибудь помочь мне с кодом для контроллера, который создает user
и profile
в транзакции и, если проверка не проходит, снова отображает форму с ошибками? Основная проблема для меня - показать ошибки, которые я получаю из-за ограничений уникальности, которые добавляются только во время вставки Repo
, и поэтому метод valid?
их не добавляет...
Я потратил несколько часов, пытаясь заставить его работать, но я не могу сделать это должным образом, когда что-то работает, а что-то нет...
inputs_for
и наборы изменений. Внутриinputs_for
все ошибки будут вprofile_form.errors
(той, что передана функцииinputs_for
). Вы можете перечислить ошибки профиля точно так же, как вы бы перечислили их в пользовательской модели. Прочтите эту запись в блоге для получения дополнительной информации: блог .plataformatec.com.br/2015/08/ - person José Valim   schedule 20.08.2015build
для профиля, и я пытался работать с методомvalid?
перед вставкой и другими вещами, но я не могу заставить его работать правильно. Я прочитал эту статью раз 100, но так и не нашел правильного выхода. - person NoDisplayName   schedule 20.08.2015create unique_index(...)
к своим миграциям. Пожалуйста, проверьте документы. - person José Valim   schedule 20.08.2015valid?
), он проверяет уникальные ограничения и, если, например, электронная почта уже занята, снова отображает форму с ошибкой для поля электронной почты. 3) Когда я исправляю ошибки уникальных ограничений, он запускает транзакцию и сохраняет ТОЛЬКОuser's
информацию, безprofille
. И у меня есть индекс, спасибо - person NoDisplayName   schedule 21.08.2015changeset
моделиprofile
, поэтому мне интересно, есть ли способ изменить набор изменений, который я хочу использовать для моделиprofile
? Хотите использоватьmy_changeset
вместоchangeset
или что-то в этом роде? - person NoDisplayName   schedule 22.08.2015on_cast
, которую вы можете использовать при объявлении ассоциации. - person José Valim   schedule 22.08.2015