我刚刚开始使用Phoenix,我正在浏览Sending Email&还查看Phoenix.HTML.Form文档。我已经能够根据指南正确设置所有内容,并通过 iex 发送测试电子邮件但我还没有弄清楚如何在不使用表单中的@changset的情况下发送电子邮件。我的印象是只在我使用模型数据时才需要使用@changest。对于我的场景,我只是想捕获用户点击发送时发送给我的姓名,电子邮件和消息。
非常感谢!
答案 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
联系表单中有很多代码,这就是为什么我要发布此表单,以便您不必重写它。希望对您有所帮助。