Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药/凤凰添加a。通过表单与现有实体关联_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 长生不老药/凤凰添加a。通过表单与现有实体关联

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

我对长生不老药/凤凰城很陌生,我对一个概念有点困惑。我找到了一个解决办法,但我不满意

背景: 我在数据库中创建了一个“项目”。现在,我想通过项目“显示”页面创建一个与项目相关的“工作项”。因为它与那个特定的项目相关,所以我需要将ID添加到变更集中

我试着在
项目\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