我正在使用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;
(我实际上有两个按钮,因为我正在尝试两种方式)
我得到第一个按钮:
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的路线。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
您的PATCH版本实际上有效并被路由到更新操作。 问题在于
行|> redirect(to: user_path(conn, :show, id: id))
将其更改为
|> redirect(to: user_path(conn, :show, id)
你应该做得很好: - )