标签: elixir

如何使用elixir创建一个事件发射器,otp方式

在elixir中创建前景过程的最佳方法是什么,该过程在每个给定的时间内打勾?

我的主要问题是这样的方法:

defmoulde Ticker do
  def tick do
    do_something()
    :timer.sleep(1000)
    tick
  end
end
Run Code Online (Sandbox Code Playgroud)

工作,但设计错了.它肯定不会每秒都在滴答作响,但是每秒都会增加do_something()的时间.我可以产生一个处理"某事"的过程,但仍有一个小的滞后.

此外,我正在尝试构建一个混合应用程序,有一些GenServers参与,以及一个主要的前台进程(我在这里问的那个)应该每隔x秒调用一次服务器.有这样的otp方式吗?

elixir erlang-otp eventemitter

10
推荐指数
1
解决办法
805
查看次数

在Phoenix中设置父视图/模板中的属性

我想title在凤凰城的子视图/控制器中设置应用程序模板中的标记.

title标签是内部的web/templates/layout/app.html.eex模板,但我有一个ArticlesController这使得在<%= @inner %>Rails中来的时候,会用yield电话,但无法找到其在凤凰城等价的.

将属性从其子项传递到父模板/视图的正确方法是什么?

elixir phoenix-framework

10
推荐指数
1
解决办法
1072
查看次数

获取任意整数的字节大小

给定一个整数,98749287说,是否有一些内置/ libray函数,Erlang或Elixir,用于获取字节大小?

澄清一下,用于表示二进制数的最小字节数.

看起来很简单,并且已经使用"基于分区"方法编写了一个函数,然后计算了位,但是经过一些搜索后,文档还没有找到任何看似有用的东西.

erlang elixir

10
推荐指数
1
解决办法
1318
查看次数

使用动态数量的where过滤器编写Ecto [v1]查询

这是一个理论问题,但假设数据结构不能改变,这肯定是我们想要进行查询的方式.这个问题更多的是为了更好地理解如何where动态组合过滤器而不是实际想要从这样的查询中获取结果.

想象一个带有Car表的数据库,其中每辆车都有一个manufacturer_id包含ID 的列,例如"BD324"或"GM512",其中"BD"和"GM"被视为前缀.

我们需要在汽车表上进行查找,以便当汽车的manufacturer_id前缀与给定的一组前缀匹配时返回汽车.所以,给出一个前缀列表:

prefixes = ["BD", "GM", "EX", "RD", "DE"]
Run Code Online (Sandbox Code Playgroud)

..we'd想返回有所有汽车manufacturer_id与启动任何所列出的那些.即(如x 类似y 类似z).

以下Elixir/Ecto代码将搜索一个前缀:

search_prefix = Enum.at(prefixes, 0) <> "%"
from c in Car, where: like(c.manufacturer_id, ^search_prefix)
Run Code Online (Sandbox Code Playgroud)

我们如何where根据prefixes列表建立条款?

elixir ecto

10
推荐指数
2
解决办法
1438
查看次数

Elixir Phoenix全球变量插头

我试图基于其域获取网站的标识符,但在为其编写插件后,我遇到了一个问题,其中系统中的所有链接都返回根URL内容.

LIB/MyApp的/插头/ request_var.ex

defmodule Myapp.Plug.RequestVar do
  import Plug.Conn

  @doc false
  def init(default), do: default

  @doc false
  def call(conn, router) do
    host = conn.host
    if host == "ll.com" || host == "domain1.com" do
      slug = "domain1"
    else
      slug = "domain2"
    end

    conn |> put_private(:site_slug, slug)
  end
end
Run Code Online (Sandbox Code Playgroud)

在lib/myapp/endpoint.ex中

plug Myapp.Plug.RequestVar, Myapp.Router
plug Myapp.Router
Run Code Online (Sandbox Code Playgroud)

这个插头有什么问题吗?

编辑:根据响应修复"if"条件.

elixir phoenix-framework

10
推荐指数
1
解决办法
1141
查看次数

如何在iex中查看凤凰路线?

如何查看路径的输出iex

我知道我可以做到这一点,mix Phoenix.routes但我想以交互方式做到这一点.

这是我想做的一个例子:

iex -S Phoenix.server

mymodel_path
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

** (CompileError) iex:2: undefined function mymodel_path/0
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

10
推荐指数
2
解决办法
2080
查看次数

如何为许多应用程序构建Phoenix伞框架

我正在玩一个使用phx 1.3和伞形应用程序的新产品套件的架构.

我有一个基于Phoenix的企业级WebRTC软电话(许多按键,一个显示器,多个输入和输出音频设备选择等).我用Phoenix开发了一个Slack克隆消息传递应用程序原型.这两个应用程序相当大我需要将手机与聊天应用程序集成到一个前端,可能只是手机,只是聊天客户端,两者都是.我需要向聊天客户端添加许多新功能,我还希望该体系结构支持使用同一客户端在呼叫服务器上设置其他设置(基于用户)以及可能的大量管理级别设置.我可能也会在未来添加其他应用程序,如操作员面板,日志查看器,列表继续...客户端JS非常简单,没有前端框架.我渲染模板服务器端并通过频道推出html.

我想建立这个可插拔的.相同的端点和数据库.一个常见的UX.

我认为伞中有两个常见的应用程序,一个用于Phoenix端点和一对控制器,另一个用于主要的Repo和一些模式.我试图弄清楚为每个应用程序使用两个或更多其他应用程序会有多困难.一个用于上下文和模式,另一个用于控制器,视图,模板和早午餐资源.可能是第三方API的另一个.

为了实现这一点,我需要为每个应用程序中的路由器进行动态调度.处理每个应用程序中包含的迁移的方法,可能还有更多我尚未想到的.

有人试过吗?是否有任何类似结构的开源项目?

elixir phoenix-framework

10
推荐指数
1
解决办法
2145
查看次数

如何使用typespecs和Dialyzer with Behaviors?

在Elixir中,我如何记录函数将返回实现特定行为的模块?

要使用一个简单的例子,假设我创建了一个GreeterBehaviour由两个模块实现的行为:

defmodule GreeterBehaviour do
  @callback say_hello(String.t) :: String.t
end

defmodule FormalGreeter do
  @behaviour GreeterBehaviour

  def say_hello(name) do
    "Good day to you #{name}"
  end
end

defmodule CasualGreeter do
  @behaviour GreeterBehaviour

  def say_hello(name) do
    "Hey #{name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,我想通过函数检索Greeter,轻松地换掉这些实现中的任何一个:

defmodule MyApp do
  def main do
    greeter().say_hello("Pete") |> IO.puts
  end

  @spec greeter() :: GreeterBehaviour # This doesn't work with dialyzer
  def greeter do
    FormalGreeter # Can easily be swapped to CasualGreeter
  end
end
Run Code Online (Sandbox Code Playgroud)

Dialyzer将成功检查两者CasualGreeterFormalGreeter正确实现该GreeterBehaviour行为.但是,我如何定义一个typespec,以便Dialyzer检查 …

elixir

10
推荐指数
1
解决办法
607
查看次数

如何避免Edeliver部署错误:"vm.args:没有这样的文件或目录"?

上下文

我们正尝试将edeliverPhoenix Web应用程序的"热升级"部署到远程虚拟机实例.

我们的目标是每次都构建应用程序的"升级"版本,以便应用程序可以在生产中"热"升级而无需任何停机时间.

我们成功地在"Hello World"凤凰应用程序上进行了"热升级":https: //github.com/nelsonic/hello_world_edeliver,当构建通过时,它会自动从Travis-CI部署.请参阅:https://travis-ci.org/nelsonic/hello_world_edeliver/builds/259965752#L1752

因此,理论上这种技术应该适用于我们的"真实"应用程序.

尝试使用Edeliver部署"真正的"Phoenix应用程序

执行以下命令(构建升级):

mix edeliver build upgrade --auto-version=git-revision --from=$(git rev-parse HEAD~) --to=$(git rev-parse HEAD) --verbose
Run Code Online (Sandbox Code Playgroud)

即"构建从以前的git版本到当前版本的升级"

到现在为止还挺好." 发布成功! "

edeliver升级 - 构建 - 成功

错误: vm.args: No such file or directory

当我们尝试部署升级时:

mix edeliver deploy upgrade to production --version=1.0.3+86d55eb --verbose
Run Code Online (Sandbox Code Playgroud)

vm.args-没有这样的文件,或目录

cat: /home/hladmin/healthlocker/releases/1.0.3+86d55eb/vm.args: No such file or directory
Run Code Online (Sandbox Code Playgroud)

注意:我们有一个小的bash脚本,它读取可用的最新升级版本.deliver/releases并进行部署,看看:version.sh

题:

有没有办法忽略vm.args文件的缺失并继续部署?

或者,如果需要文件来完成部署,是否有一些关于如何创建文件的文档? …

deployment elixir phoenix-framework edeliver distillery

10
推荐指数
1
解决办法
393
查看次数

如何在Elixir中将float转换为整数

给定一个浮点数,比方说(2.0),我想将它转换为Integer类型.就我所知,Integer.parse看起来只适用于字符串.

Integer.parse(2.0)
(FunctionClauseError) no function clause matching in Integer.count_digits/2
Run Code Online (Sandbox Code Playgroud)

elixir

10
推荐指数
2
解决办法
3983
查看次数