我想在自定义混合任务中通过Ecto显示来自我的数据库的数据.如何在我的任务中获得Ecto仓库(或启动它)?
我试过这样的东西,但它不起作用:
defmodule Mix.Tasks.Users.List do
use Mix.Task
use Mix.Config
use Ecto.Repo, otp_app: :app
@shortdoc "List active users"
@moduledoc """
List active users
"""
def run(_) do
import Ecto.Query, only: [from: 1]
Mix.shell.info "=== Active users ==="
query = from u in "users"
sync = all(query)
Enum.each(users, fn(s) -> IO.puts(u.name) end)
end
end
Run Code Online (Sandbox Code Playgroud)
当我启动mix users.list时,这会给我以下输出:
** (ArgumentError) repo Mix.Tasks.Users.List is not started, please ensure it is part of your supervision tree
lib/ecto/query/planner.ex:64: Ecto.Query.Planner.query_lookup/5
lib/ecto/query/planner.ex:48: Ecto.Query.Planner.query_with_cache/6
lib/ecto/repo/queryable.ex:119: Ecto.Repo.Queryable.execute/5
Run Code Online (Sandbox Code Playgroud)
有什么想法或其他方法来解决这个问题?
我有一个结构,@derive Jason.Encoder但该结构中的某些字段是元组,因此无法对结构进行编码,我该如何解决:/
更新
我已经使用下面提到的方法来实现协议。关于这种方法需要注意的一件重要事情是它会改变整个项目的编码,请小心!
免责声明:我在这里检查过这个问题并没有回答我的问题.
我试图想出一种嵌套结构解析JSON的方法.例:
{"name": "blah blah", "address": {"street": "smthing"}}
Run Code Online (Sandbox Code Playgroud)
我想达到这个结果:
%User{name: "blah blah", address: %Address{street: "smthing"}}
Run Code Online (Sandbox Code Playgroud)
因为这样可以更容易地插入验证(使用Vex作为exapmle).
我知道Poison支持"as struct"选项,但它不提供嵌套.以上将被解析:
%User{name: "blah blah", address: %{"street" => "smthing"}}.
Run Code Online (Sandbox Code Playgroud)
我知道我可以为模块编写解码器实现,User但我想这不是预期的用例,它不是通用的.
当想知道一个实现时,我找不到一种方法来判断一个原子是否是一个模块......也许我不得不一起去:code.is_loaded(module_name)?
无论如何,在尝试实现之前,我想知道是否有一些我没有看到的东西.
我希望逐步将遗留API应用程序移植到Phoenix.理想情况下,我会将应用程序的子域划分为单独的Phoenix应用程序,并将它们托管在不同的服务器节点上.
我希望使用Phoenix频道来促进应用与应用之间的沟通.如何将一个Phoenix应用程序连接到另一个渠道和主题?例如,我想设置一个带有WebSockets的'jobs.foo.com'子域,如:
socket "/ws", Jobs do
channel "jobs:work_orders", WorkOrdersChannel
end
Run Code Online (Sandbox Code Playgroud)
从另一个凤凰应用程序(例如:报告)我想发布/转到该职位频道主题.是否可以Phoenix.Endpoint在Reports中创建Jobs lib,并Jobs.Endpoint在config.exs中配置该url?我可以使用类似于Phoenix.PubSub.subscribe/4名为pubsub端点的东西吗?
我不确定我的想法是否合理.如果有更明智的方法,我愿意接受建议.
- 编辑 -
只是为了澄清我想要完成的事情......我想让一个Phoenix应用程序通过WebSocket客户端连接到另一个.这将允许我拥有具有不同域逻辑的应用程序,通过频道和共同感兴趣的主题进行通信.
我想在Node.js中像"gulp.js"那样进行自动构建.
$ iex -S mix -e'DribbbleGif.main'
**(混合)不能隐式地将标志传递给默认混合任务,请调用:mix run
我想在1行命令中执行此操作.
因为,最后我想看这样的文件.
chokidar**/*.exs**/*.ex -c'iex -S mix -e'DribbbleGif.main''
如果您有其他自动构建解决方案,请告诉我.
我现在被困了几个小时,试图弄清楚如何在没有任何其他框架的情况下配置Plug.Static (Phoenix,Sugar,...); 只是牛仔,插头和Elixir.我只是不知道如何把东西放在路由器里.
plug :match
plug Plug.Static, at: "/pub", from: :cerber
plug :dispatch
get "/" do
Logger.info "GET /"
send_resp(conn, 200, "Hello world\n")
end
Run Code Online (Sandbox Code Playgroud)
Plug.Static在正确的地方吗?不应该之后plug :dispatch吗?index.html?index.html应该位于何处我迷失了......
感谢您的反馈
在Ruby中,我会使用RUBY_PLATFORM常量来确定我的程序运行的操作系统(Mac,Windows,Linux等).Elixir有办法获取这些信息吗?
我目前正在尝试重新创建我在Elixir中编写的Ruby程序,并且我有一个方法可以进行依赖于操作系统的系统调用以打开文档.该方法看起来像:
def self.open_document(filename)
case RUBY_PLATFORM
when %r(darwin)
system('open', filename)
when %r(linux)
system('xdg-open', filename)
when %r(windows)
system('cmd', '/c', "\"start #{filename}\"")
else
puts "Don't know how to open file"
end
end
Run Code Online (Sandbox Code Playgroud)
我知道我可以运行Ruby的Kernel.system使用药剂的命令System.cmd/3,但我不知道如何获得RUBY_PLATFORM同等价值,使交换机上的case声明,还是我居然能获得这些信息.这可能吗?
iex> :os.type
{:unix, :darwin}
iex> System.cmd("uname", ["-s"])
{"Darwin\n", 0}
Run Code Online (Sandbox Code Playgroud) 我遇到了一些Erlang代码,我试图将其转换为Elixir,以帮助我学习这两种语言并理解其中的差异.宏观和元编程一般是我仍然试图解决的话题,所以希望你能理解我的困惑.
Erlang代码
-define(p2(MAT, REP),
p2(W = MAT ++ STM) -> m_rep(0, W, STM, REP))
% where m_rep is a function already defined.
Run Code Online (Sandbox Code Playgroud)
对我来说,似乎在上面的代码中,有两个单独的p2宏定义映射到一个名为的私有函数m_rep.但是在Elixir中,似乎只能有一个模式匹配定义.Elixir也有可能有不同的吗?
我创建了一个Phoenix应用程序,然后添加了用于发送电子邮件的Bamboo模块,我今天下午使用Elixir成功发送了我的第一封电子邮件,但我不得不将用户名和密码硬编码到config.exs.
我读了这篇文章并在我的凤凰项目的根目录中设置了一个.env文件,我试图在config.exs文件中使用以下语句加载环境变量.
username: System.get_env("SMTP_USERNAME"),
password: System.get_env("SMTP_PASSWORD"),
Run Code Online (Sandbox Code Playgroud)
但是,电子邮件没有发送,竹子给了我一个相当神秘的错误信息.
我正在使用终端中的以下命令构建phoenix应用程序,
iex -S mix
Run Code Online (Sandbox Code Playgroud)
我在ifx会话中手动发送电子邮件,其命令类似于下面的命令,
CrjApi.Email.hello_text_email("me@example.com") |> CrjApi.Mailer.deliver_now
Run Code Online (Sandbox Code Playgroud)
但只有在用户名/密码被硬编码到config.exs文件中时才会发送电子邮件.我如何使用.env我设置的文件,所以我不必硬编码用户名/密码config.exs?
注意:我正在运行OS X,并使用鱼壳.
Elixir中最直接,最有效的方法是什么?
Starting number: 123.101
Ending number: 123.101000 # Adding 3 digits to the precision of a float.
Starting number: 123
Ending number: 123.000 # Adding 3 digits to the precision of an integer.
Starting number: 123.101
Ending number: 123.1 # removing precision
Starting number: 123.000
Ending number: 123 # removing precision
Run Code Online (Sandbox Code Playgroud)