Hello dear friends,
I am supposed to edit one field of record in ecto, but I need to check my record by ChangeSet, it should be noted , I need to check the field which I need to edit , not other field, not all of my fields . just one or two field that I need.
for example :
my fields :
field :full_name, :string
field :email, :string
field :password, :string, virtual: true
field :name, :string, virtual: true
field :lastname, :string, virtual: true
field :password_hash, :string
field :last_ip, :string
field :group_acl, :string
field :language, :string
field :country, :string
I just decided to edit “:group_acl” , I did it
def get_user_by_id(id) do
Repo.get!(UsersInfo, id)
end
def edit_user(id, map_params) do
user = get_user_by_id(id)
users = Ecto.Changeset.change(user , map_params)
case Repo.update(users) do
{:ok, struct} -> IO.inspect struct
{:error, changeset} -> IO.inspect changeset
end
end
and in my phoenix controller :
def forget_password(conn, %{"id" => id , "group_acl" => group_acl}) do
forget_passwords = case UsersInfoQuery.edit_user(id, %{group_acl: group_acl}) do
{:ok, _} ->
conn
|> put_status(200)
|> json(%{message: "Your edit was successful."})
{:error, _} ->
conn
|> put_status(403)
|> json(%{error_code: "403"})
end
forget_passwords
end
it is edited successful, but I have errors in my terminal ( The condition is always correct, but my request is not valid) :
[error] #PID<0.687.0> running TrangellUsersServiceWeb.Endpoint terminated
Server: localhost:4021 (http)
Request: POST /api/users/forget-password
** (exit) an exception was raised:
** (CaseClauseError) no case clause matching: %TrangellUsersService.Login.Db.UsersInfo{__meta__: #Ecto.Schema.Metadata<:loaded, "usersinfo">, country: "Australia", email: "3@gmail.com", full_name: "shahryar tavakkoli", group_acl: "999", id: "2c409b05-99d0-4f73-8dfe-fc3df9aa7c73", inserted_at: ~N[2018-03-27 08:13:33.380492], language: "fa", last_ip: "127.0.0.1", lastname: nil, login_actions: #Ecto.Association.NotLoaded<association :login_actions is not loaded>, name: nil, password: nil, password_hash: "$2b$12$KqSpLbLkFvl6jw9D1QDR/uTw/NZPb4pdOf3XgfJfnbv9.Qi/bS6ki", profile_actions: #Ecto.Association.NotLoaded<association :profile_actions is not loaded>, token_actions: #Ecto.Association.NotLoaded<association :token_actions is not loaded>, updated_at: ~N[2018-04-02 20:59:51.986916]}
(trangell_users_service_web) lib/trangell_users_service_web/controllers/login_controller.ex:178: TrangellUsersServiceWeb.LoginController.forget_password/2
(trangell_users_service_web) lib/trangell_users_service_web/controllers/login_controller.ex:5: TrangellUsersServiceWeb.LoginController.action/2
(trangell_users_service_web) lib/trangell_users_service_web/controllers/login_controller.ex:5: TrangellUsersServiceWeb.LoginController.phoenix_controller_pipeline/2
(trangell_users_service_web) lib/trangell_users_service_web/endpoint.ex:1: TrangellUsersServiceWeb.Endpoint.instrument/4
(phoenix) lib/phoenix/router.ex:278: Phoenix.Router.__call__/1
(trangell_users_service_web) lib/trangell_users_service_web/endpoint.ex:1: TrangellUsersServiceWeb.Endpoint.plug_builder_call/2
(trangell_users_service_web) lib/plug/debugger.ex:99: TrangellUsersServiceWeb.Endpoint."call (overridable 3)"/2
(trangell_users_service_web) lib/trangell_users_service_web/endpoint.ex:1: TrangellUsersServiceWeb.Endpoint.call/2
(plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
(cowboy) /Applications/MAMP/htdocs/elixir-ex-source/Trangell_Main/trangell_users_service_umbrella/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
just the field which i need validation :
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:full_name, :lastname, :name, :email, :password, :last_ip, :group_acl, :language, :country, :password_hash])
|> validate_required([:name, :lastname, :email, :password, :last_ip, :group_acl,:language, :country])
.......
|> validate_length(:group_acl, max: 50)
|> validate_inclusion(:group_acl, ["actived", "unactived", "blocked", "registered"])
.......
.......
end