凤凰联系表格

时间:2015-10-30 05:20:30

标签: elixir phoenix-framework

我刚刚开始使用Phoenix,我正在浏览Sending Email&还查看Phoenix.HTML.Form文档。我已经能够根据指南正确设置所有内容,并通过 iex 发送测试电子邮件但我还没有弄清楚如何在不使用表单中的@changset的情况下发送电子邮件。我的印象是只在我使用模型数据时才需要使用@changest。对于我的场景,我只是想捕获用户点击发送时发送给我的姓名,电子邮件和消息。

非常感谢!

2 个答案:

答案 0 :(得分:9)

您可以使用Ecto.Schema和虚拟字段来使用变更集而不受数据库支持:

defmodule ContactForm do      
  use Ecto.Schema

  schema "" do
    field :email, :string, virtual: true
    field :name, :string, virtual: true
    field :body, :binary, virtual: true
  end

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, ["email", "name", "binary"], [])
    #|> validate_length(:body, min: 5) - any validations, etc. 
  end   
end

使用这样的模块,您可以像处理模型一样对待它,并且您的表单将被验证等等。然后您可以将整个%ContactForm{}结构传递给您的邮件程序函数以发送电子邮件。

答案 1 :(得分:1)

我使用以下内容: 架构:

defmodule App.Form.ContactForm do
  use Ecto.Schema
  import Ecto.Changeset

  schema "" do
    field :name, :string, virtual: true
    field :email, :string, virtual: true
    field :phone, :string, virtual: true
    field :body, :binary, virtual: true
  end

  def changeset(model, params) do
    model
    |> cast(params, [:name, :email, :phone, :body])
    |> validate_required([:name, :phone])
  end
end

上下文:

defmodule App.Form do
  alias App.Form.ContactForm

  def change_contact(%ContactForm{} = contact \\ %ContactForm{}) do
    ContactForm.changeset(contact, %{})
  end

  def create_contact(attrs \\ %{}) do
    contact = ContactForm.changeset(%ContactForm{}, attrs)
    contact = Map.merge(contact, %{action: :create}) # because we don't have a Repo call, we need to manually set the action.
    if contact.valid? do
      # send email or whatever here.
    end
    contact
  end
end

在html中:

<%= form_for @contact, Routes.contact_path(@conn, :contact), [as: "contact"], fn f -> %>
# the form. I leave styling up to you. Errors should be working because we set the action.

在路由器中:

post "/contact", PageController, :contact, as: :contact

以及控制器中的两个必要功能:

  def index(conn, _params) do
    render(conn, "index.html", contact: App.Form.change_contact())
  end

  def contact(conn, %{"contact" => contact_params}) do
    with changeset <- App.Form.create_contact(contact_params),
         true <- changeset.valid?
      do
      conn
      |> put_flash(:success, gettext("We will get back to you shortly."))
      |> render("index.html", contact: changeset)
    else
      _ ->
      conn
      |> put_flash(:error, gettext("Please check the errors in the form."))
      |> render("index.html", contact: App.Form.create_contact(contact_params))
    end

  end

联系表单中有很多代码,这就是为什么我要发布此表单,以便您不必重写它。希望对您有所帮助。