如何验证Ecto中相关模型的存在?
schema "foo" do
has_many: bar, Bar
timestamps
end
@required_fields ~w(bar) # invalid
Run Code Online (Sandbox Code Playgroud)
有办法吗?并验证这些字段的最小/最大数量?
我有一个Ecto模型:
defmodule Project.Category do
use Project.Web, :model
schema "categories" do
field :name, :string
field :list_order, :integer
field :parent_id, :integer
belongs_to :menu, Project.Menu
has_many :subcategories, Project.Category, foreign_key: :parent_id
timestamps
end
@required_fields ~w(name list_order)
@optional_fields ~w(menu_id parent_id)
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
Run Code Online (Sandbox Code Playgroud)
如您所见,Category模型可以通过子类别atom引用自身.
以下是与此模型关联的视图:
defmodule Project.CategoryView do
use Project.Web, :view
def render("show.json", %{category: category}) do
json = %{
id: category.id,
name: category.name,
list_order: category.list_order
parent_id: category.parent_id
}
if is_list(category.subcategories) do
children = render_many(category.subcategories, Project.CategoryView, …Run Code Online (Sandbox Code Playgroud) 我在凤凰 webapp中遇到错误,我正在开发.这是一个包含少量模型和页面的简单应用程序,其中所有模型创建表单都以多标签形式添加.
我在日志中遇到以下错误,但是在浏览器结束时工作正常.从日志中我也无法理解错误以及如何调试它.
[error] #PID<0.1603.0> running MyApp.Endpoint terminated
Server: localhost:4000 (http)
Request: GET /
** (exit) an exception was raised:
** (Plug.Conn.AlreadySentError) the response was already sent
(plug) lib/plug/conn.ex:428: Plug.Conn.resp/3
(plug) lib/plug/conn.ex:415: Plug.Conn.send_resp/3
(my_app) web/controllers/personal_info_controller.ex:1: MyApp.PersonalInfoController.phoenix_controller_pipeline/2
(my_app) lib/phoenix/router.ex:265: MyApp.Router.dispatch/2
(my_app) web/router.ex:1: MyApp.Router.do_call/2
(my_app) lib/my_app/endpoint.ex:1: MyApp.Endpoint.phoenix_pipeline/1
(my_app) lib/plug/debugger.ex:90: MyApp.Endpoint."call (overridable 3)"/2
(my_app) lib/phoenix/endpoint/render_errors.ex:34: MyApp.Endpoint.call/2
(plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
(cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
Run Code Online (Sandbox Code Playgroud) 从Elixir,我试图使用detergentex调用SOAP Web服务,这是一个围绕Erlang库清洁剂的包装器.
我可以在洗涤剂主页上的示例中调用SOAP Web服务,没有任何问题:http://www.webservicex.net/convertVolume.asmx? WSDL
参数:
wsdl_url = "http://www.webservicex.net/convertVolume.asmx?WSDL"
action = "ChangeVolumeUnit"
parameters = ["100","dry","centiliter"]
Run Code Online (Sandbox Code Playgroud)
但是,当尝试调用Axis2 Java SOAP Web服务时,我遇到了一些问题.示例:http://www.thomas-bayer.com/axis2/services/BLZService?wsdl
以下列方式调用"getBank"时
wsdl_url = "http://www.thomas-bayer.com/axis2/services/BLZService?wsdl"
action = "getBank"
parameters = ["abc"]
wsdl = Detergentex.init_model(wsdl_url)
res = Detergentex.call(wsdl, action, parameters)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
{:error, 'Struct doesn\'t match model: recordtype not expected: p:getBank'}
Run Code Online (Sandbox Code Playgroud)
使用以下堆栈跟踪
src/erlsom_write.erl:357: :erlsom_write.findAlternative/4
src/erlsom_write.erl:258: :erlsom_write.processSubType/5
src/erlsom_write.erl:241: :erlsom_write.processElementValues/7
src/erlsom_write.erl:132: :erlsom_write.struct2xml/6
src/erlsom_write.erl:323: :erlsom_write.processAlternativeValue/8
src/erlsom_write.erl:241: :erlsom_write.processElementValues/7
src/erlsom_write.erl:116: :erlsom_write.struct2xml/6
src/erlsom_write.erl:323: :erlsom_write.processAlternativeValue/8
src/erlsom_write.erl:241: :erlsom_write.processElementValues/7
src/erlsom_write.erl:45: :erlsom_write.write/2
src/detergent.erl:211: :detergent.call_attach/8 …Run Code Online (Sandbox Code Playgroud) 比方说,我有两个型号,Post并Comment和评论模型可以是1出2种,normal并且fancy这是由列定义type的comments表.
现在我想在我的Post模型上添加2个关联,其中一个引用花哨的注释,一个引用正常注释,我该怎么做?所以我想要这样的东西:
has_many :fancy_comments, MyApp.Comment, where: [type: 0]
has_many :normal_comments, MyApp.Comment, where: [type: 1]
Run Code Online (Sandbox Code Playgroud) 我有一个Elixir/Phoenix服务器应用程序,客户端通过websockets通过内置通道系统连接.现在我想检测用户何时离开频道.
旁注:我正在使用Google Chrome扩展程序中的javascript客户端库.为此,我从Phoenix中提取了ES6代码,将其转换为javascript,并稍微调整一下,使其独立运行.
现在当我关闭弹出窗口时,服务器立即触发该terminate/2功能reason = {:shutdown, :closed}.扩展端没有任何关闭回调,所以这很棒!
但是,当客户端只是失去网络连接(我连接第二台计算机,只是拉出网络插头),然后terminate/2将不会触发.
为什么以及如何解决此问题?
我玩了timeout选择,transport :websocket, Phoenix.Transports.WebSocket但这没有成功.
更新:
使用新的真棒凤凰1.2的Presence东西,这不再需要了.
为什么我不能使用String或其他模块保护?
码:
def foo(s1, s2) when String.length(s1) == String.length(s2) do
# something
end
Run Code Online (Sandbox Code Playgroud)
当我希望使用模块功能时,如何优雅地重新格式化这种情况?
如何在ELixir中记录地图/结构类型而不必实现protocol String.Chars?
require Logger
Logger.debug %{my: "map"}
** (Protocol.UndefinedError) protocol String.Chars not implemented for %{my: "map"}
(elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1
(elixir) lib/string/chars.ex:17: String.Chars.to_string/1
Run Code Online (Sandbox Code Playgroud) 我有多个mix任务要连续运行.使用其他构建工具,可以使用单个语句运行任务,从而在第一个任务之后节省任何启动开销.如何用Elixir的mix命令完成这项工作?