Elixir 长生不老药/凤凰添加a。通过表单与现有实体关联
我对长生不老药/凤凰城很陌生,我对一个概念有点困惑。我找到了一个解决办法,但我不满意 背景: 我在数据库中创建了一个“项目”。现在,我想通过项目“显示”页面创建一个与项目相关的“工作项”。因为它与那个特定的项目相关,所以我需要将ID添加到变更集中 我试着在Elixir 长生不老药/凤凰添加a。通过表单与现有实体关联,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我对长生不老药/凤凰城很陌生,我对一个概念有点困惑。我找到了一个解决办法,但我不满意 背景: 我在数据库中创建了一个“项目”。现在,我想通过项目“显示”页面创建一个与项目相关的“工作项”。因为它与那个特定的项目相关,所以我需要将ID添加到变更集中 我试着在项目\u控制器中这样做: def show(conn, %{"id" => id}) do project = Clients.get_project!(id) changeset = Client
项目\u控制器
中这样做:
def show(conn, %{"id" => id}) do
project = Clients.get_project!(id)
changeset = Clients.change_work_item(%BudgetItem{project_id: project.id})
render(conn, "show.html", project: project, changeset: changeset)
end
表格如下:
%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<%= label f, :title %>
<%= text_input f, :title %>
<%= error_tag f, :title %>
<%= label f, "duration" %>
<%= number_input f, :amount_in_cents %>
<%= error_tag f, :amount_in_cents %>
<div>
<%= submit "Save" %>
</div>
<% end %>
我认为你有很好的准备来处理你的情况。 您的项目id来自用户所在的路径,在控制器中,您只需在数据库中找到该项目的存在。所有这些看起来都不错。
但是问题是你的
show
你不需要这个代码changeset=Clients.change\u-work\u项目(%BudgetItem{project\u-id:project.id})
只要用你的BudgetItem呈现一个变更集就可以了:changeset=Clients.change\u-work(%BudgetItem{})
。现在,对于与此相关的控制器的post操作(您尚未发布),您可以使用发送给控制器的id查找项目,并使用build\u assoc
创建关联的工作项。如果您可以在post controller和客户端上下文中发送代码,那么会更容易提供帮助。谢谢@franck的回答-我也添加了控制器。问题是-这是一个不同的控制器work\u item\u controller
显示在projects\u controller
中。我一辈子都不知道从哪里获得项目ID-请告诉我,我快发疯了:)控制器的编辑看起来不错。现在,您还必须在work\u item\u控制器中获取项目的id<代码>定义创建(conn,%{“id”=>项目id,“工作项”=>工作项参数)。然后使用客户机获取项目。获取项目!(项目id)
。最后,将项目发送到客户端。创建工作项(项目,工作项参数)
。在函数中,您可以使用put\u assoc
分配工作项。希望能有帮助
defmodule SthWeb.WorkItemController do
use SthWeb, :controller
alias Sth.Clients
alias Sth.Clients.Project
def create(conn, %{"work_item" => work_item_params}) do
case Clients.create_work_item(work_item_params) do
{:ok, work_item} ->
conn
|> put_flash(:info, "Budget increased successfully!")
|> redirect(to: Routes.project_path(conn, :show, work_item.project_id))
{:error, changeset} ->
conn
|> put_flash(:info, "Something went wrong.")
|> redirect(to: Routes.project_path(conn, :show, 1))
end
end
end