【问题标题】:Passing id/object from one page/context to another in Phoenix 1.4在 Phoenix 1.4 中将 id/object 从一个页面/上下文传递到另一个页面/上下文
【发布时间】:2020-02-15 19:52:12
【问题描述】:

我有一个事件页面,它是一个列表,我希望用户单击特定事件来创建一个被邀请的请求。我希望请求与该事件相关联,并希望事件数据(名称、位置等)显示在新的请求表单页面上。 事件是一种“对象”,而请求是另一种。一个事件可以有许多请求,但不能有其他方式(所以一对多)。如果这样做更好,我可以建立 has_many/belongs_to 关系,或者我可以简单地在请求中放置一个 event_id - 我没有偏好。这是一个 Phoenix 1.4 项目,没有什么特别或定制的,由 PostgreSQL 数据库支持。

我不知道如何将事件或 event_id 传递给新请求表单。 Phoenix 框架中的大多数东西都非常棒,但我无法找到正确的方法来完成这件简单的事情。

我现在所拥有的或多或少基于基本指南:

project/lib/project_web/templates/tms/event/index.html.eex(事件列表)

 <table><tbody><tr><td><%= link event.title, to: Routes.tms_request_path(@conn, :new) %></td></tr></tbody></table>

这去 lib/project_web/controllers/request_controller.ex(控制器)

def new(conn, _params) do
    changeset = TMS.change_request(%Request{})
    render(conn, “new.html”, changeset: changeset)
end

这去 lib/project/tms.ex(上下文)

def change_request(%Request{} = request) do
    Request.changeset(request, %{})
end

去哪 lib/project/tms/request.ex(架构)

def changeset(request, attrs) do
    request
        |> cast(attrs, [:name, :event_id, :email, :request_count]
        |> validate_required([:name, :event_id, :email, :request_count]

lib/project_web/tms/request/new.html 是一个带有请求属性框的表单

现在一切正常,我可以单击事件列表中的链接并转到新请求表单页面并保存请求。显然,虽然没有以这种方式建立的 ID 或关联。 显然我想以 Elixir 的方式做到这一点,而不是一起破解一些东西。我尝试了几种不同的方法来传递 event_id,但它们似乎都不起作用,所以我知道我错过了一些东西,但在这一点上,我不知道那是什么。

【问题讨论】:

    标签: phoenix-framework elixir


    【解决方案1】:

    事件id可以通过params传递为:

    Routes.request_path(@conn, :new, event_id: event.id) # not tms_request_path
    

    并在 lib/project_web/controllers/request_controller.ex 作为新函数中的 event_id 参数接收:

    def new(conn %{"event_id" => event_id}) do
      # the even_id can be passed directly to new form
      render(conn, “new.html”, event_id: event_id) 
    end
    

    然后你可以获取新形式的event_id作为@event_id参数

    【讨论】:

    • 谢谢。我发誓我试过了,但我一定是跑到某个地方然后感到沮丧。出于我的目的,我决定在 def new 中调用 Event,然后将整个 @event 作为参数传递,这样我就可以轻松访问所需的任何事件字段。
    猜你喜欢
    • 2018-03-19
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多