Phoenix Framework - 如何更新数据库中的记录并使用PATCH方法?

时间:2015-11-25 18:13:42

标签: elixir phoenix-framework

我正在使用Phoenix Framework构建应用程序,并且我已经完成了所有CRUD操作,但更新/编辑了一个。我已阅读并完成了编程凤凰书,但我仍然无法执行更新操作。我认为问题是我需要以某种方式覆盖POST方法。

这是我更新的变更集:

        def changeset_update(model, params \\ :empty) do
        model
        |> cast(params, [], [])
        |> validate_length(:username, min: 1, max: 20)
        end

我在控制器中的动作:

    def update(conn, %{"user" => user_params, "id" => id}) do
    user      = Repo.get!(User, id) 
    changeset = User.changeset_update(%User{}, user_params)
    IO.puts changeset.valid?

    case Repo.update(changeset) do 
        {:ok, user} ->
            conn
            |> put_flash(:info, "#{user.name} updated successfully!")
            |> redirect(to: user_path(conn, :show, id: id))
        {:error, changeset} ->
            render conn, "edit.html", changeset: changeset, user: user
    end
    end

和我的页面:



<h1>Edit User</h1>

<%= form_for @changeset, admin_path(@conn, :update, @user), fn f -> %>
	<%= if @changeset.action do %>
    <div class="alert alert-danger">
      <p>Oops, something went wrong! Please check the errors below:</p>
      <ul>
        <%= for {attr, message} <- f.errors do %>
          <li><%= humanize(attr) %> <%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

	<div class="form-group">
		<input type="hidden" name="_method" value="patch">
			<%= text_input f, :name, placeholder: @user.name, 
				class: "form-control" %>

			<%= text_input f, :username, placeholder: @user.username, 
				class: "form-control" %>

			<%= email_input f, :email, placeholder: @user.email, 
				class: "form-control" %>

			<%= text_input f, :client, placeholder: @user.client, 
				class: "form-control" %>

			<%= number_input f, :role, placeholder: @user.role, 
				class: "form-control" %>

			<button type="submit" class="btn btn-primary">Save</button>
	</div>
<% end %>	

<%= link "Update", to: admin_path(@conn, :update, @user.id),
	method: :update, data: [confirm: "Update this user's record?"], 
			class: "btn btn-default btn-xs" %>
&#13;
&#13;
&#13;

(我实际上有两个按钮,因为我正在尝试两种方式)

我得到第一个按钮:

    Protocol.UndefinedError at PATCH /admin/users/13

    protocol Phoenix.Param not implemented for [id: "13"]

但我的routes.ex

中有:update动作的路由/ admin / users /:id

我得到第二个按钮:

    Phoenix.Router.NoRouteError at POST /admin/users/13

    no route found for POST /admin/users/13 (MyApp.Router)

我猜这是正常的,因为我没有POST的路线。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您的PATCH版本实际上有效并被路由到更新操作。 问题在于

|> redirect(to: user_path(conn, :show, id: id))

将其更改为

|> redirect(to: user_path(conn, :show, id)

你应该做得很好: - )