标签: phoenix-framework

使用Elixir和Phoenix框架形成对象

我不知道是否有是创建表单对象的方式ElixirPhoenix框架?我想实现类似于reformgem所做的事情,Rails因为我不喜欢在每种情况下都运行相同的验证,这导致了我的经验中的复杂代码.那么我可以创建类似下面的内容并以某种方式使其工作吗?

defmodule RegistrationForm do
  defstruct email: nil, password: nil, age: nil    

  import Ecto.Changeset       

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, ["email", "password", "age"], ~w())
    |> validate_length(:email, min: 5, max: 240)       
    |> validate_length(:password, min: 8, max: 240)
    |> validate_inclusion(:age, 0..130)        
  end   

end
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

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

如何使用Phoenix向特定套接字发送消息

我有一些验证套接字:

defmodule Test.UserSocket do
  use Phoenix.Socket

  ## Channels
  channel "user:*", Test.RoomChannel

  def connect(_params, socket) do
    case Phoenix.Token.verify(socket, "user",  _params["token"]) do
          {:ok, uid} ->
            {:ok, assign(socket, :user_id, uid)}
          {:error, _} ->
            :error
     end
  end

 def id(_socket), do: "user:#{_socket.assigns.user_id}"
end
Run Code Online (Sandbox Code Playgroud)

并在连接套接字后命名为 user:#id

从文档中我可以发送断开连接事件 Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})

问题:如何将自定义事件发送到套接字user:#id,它应该像是对特定套接字的推送通知.

我试过Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"}但它不起作用,因为我无法在套接字上听"new:msg".

elixir phoenix-framework

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

如何避免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
查看次数

在Ecto中按DateTime查询

这是我尝试过的.

date = Ecto.DateTime.from_erl(:calendar.universal_time())
query |> where([record], record.deadline >= ^date)
Run Code Online (Sandbox Code Playgroud)

我也试过了

date = Ecto.DateTime.from_erl(:calendar.universal_time())
query = from m in MyApp.SomeModel,
      where: m.deadline >= ^date,
      select: m
Run Code Online (Sandbox Code Playgroud)

两者都返回相同的消息

value `%Ecto.DateTime{..}` in `where` cannot be cast to type :datetime in query
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我应该在我的查询中使用Ecto.DateTime.也许我错过了一些明显的东西?谢谢!

elixir ecto phoenix-framework

9
推荐指数
1
解决办法
3163
查看次数

Postgres - Phoenix/Elixir安装错误

使用Phoenix框架 - Step by Step,在15分钟内关注本教程Elixir博客

但我有一个问题,我不知道如何解决.我认为它与postgres有关.

我做了:

$ mix ecto.create
$ mix ecto.migrate

    C:\Users\999\Documents\elixir_files\blog>mix ecto.create
** (RuntimeError) could not find executable `psql` in path, please guarantee it is available before running ecto commands
    lib/ecto/adapters/postgres.ex:105: Ecto.Adapters.Postgres.run_with_psql/2
    lib/ecto/adapters/postgres.ex:82: Ecto.Adapters.Postgres.storage_up/1
    lib/mix/tasks/ecto.create.ex:32: Mix.Tasks.Ecto.Create.run/1
    (mix) lib/mix/cli.ex:55: Mix.CLI.run_task/2
    (stdlib) erl_eval.erl:669: :erl_eval.do_apply/6
    (elixir) lib/code.ex:131: Code.eval_string/3


C:\Users\999\Documents\elixir_files\blog>mix ecto.migrate
[warning] the :size option when configuring Blog.Repo is deprecated, please use :pool_size instead
** (exit) exited in: GenServer.call(#PID<0.139.0>, {:query, "CREATE TABLE IF NOT EXISTS \"schema_migrations\" (\"version\" bigint …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

9
推荐指数
1
解决办法
3402
查看次数

模块插头的防护装置?

请原谅新手问题,但我发现了许多保护功能插头的例子:

plug :assign_welcome_message, "Hi!" when action in [:index, :show]
Run Code Online (Sandbox Code Playgroud)

但我没有找到如何使用模块插件执行此操作的示例:

plug Guardian.Plug.EnsurePermissions,
  handler: Mp.Api.AuthController,
  admin: [:dashboard] when action in [:protected_action]
Run Code Online (Sandbox Code Playgroud)

我似乎移动的when action in [:protected_action]任何地方或者给我一个语法错误或一个未定义的函数when/2.我知道我做的事情很愚蠢,但我看不清楚!

救命!


phoenix 1.1.4

elixir phoenix-framework

9
推荐指数
1
解决办法
991
查看次数

凤凰控制器 - 单数还是复数?

我知道Rails有一个非常可靠的约定,有多个控制器名称ex:CustomersController.Elixir似乎并不在乎,因为路由的完成方式不同.是否有一种惯用的方式来命名控制器在凤凰城?

elixir phoenix-framework

9
推荐指数
1
解决办法
1420
查看次数

使用Ecto的原始SQL

我是Elixir和Phoenix Framework的新世界.我正在尝试关注TheFireHoseProject教程,但是在使用Ecto查询原始SQL时遇到问题.该教程说这应该工作:

defmodule Queries do
def random do
  query = Ecto.Adapters.Postgres.query(
    Repo,
    "SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1",
    [])
  %Postgrex.Result{rows: [row]} = query
  {id, saying, author} = row
  %Splurty.Quote{id: id, saying: saying, author: author}
end
end
Run Code Online (Sandbox Code Playgroud)

我收到一个运行时错误,即Ecto.Adapters.Postgres.query不存在(未定义的函数).

我试图搜索Ecto文档,发现可能有一个名为run_query的函数,但它也不起作用.

我想我正在使用Ecto 1.1.4并且我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)样本.

firehoseproject的链接是:http://phoenix.thefirehoseproject.com/

elixir phoenix-framework

9
推荐指数
2
解决办法
3257
查看次数

尝试创建数据库时出错 - Ecto - Phoenix

我在尝试创建数据库时遇到错误.我安装了postgres,我已经成功完成了一些测试项目.而且,我没有看到这个错误.任何帮助都会很棒:

错误:

 ~/Desktop/elixir/restore $ mix ecto.create
** (Mix) The database for Restore.Repo couldn't be created: tcp connect: connection refused - :econnrefused

21:52:23.978 [error] GenServer #PID<0.150.0> terminating
** (Postgrex.Error) tcp connect: connection refused - :econnrefused
    (db_connection) lib/db_connection/connection.ex:148: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:623: Connection.enter_connect/5
    (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto phoenix-framework

9
推荐指数
2
解决办法
3263
查看次数

Edeliver在随机TCP端口上启动Phoenix/Elixir应用程序

我们正在尝试将我们的Phoenix Web App部署到Linux VM(在我们的Azure案例中)使用edeliver 我们已经使用Azure部署了一个"基本"博客应用程序,edeliver记录了以下步骤:https: //github.com/dwyl/learn-微软蔚蓝#部分2 -部署-您的应用程序

当我们手动运行(" ")的应用程序:https://github.com/nelsonic/healthlocker 使用上的实例MIX_ENV=prod mix phoenix.server运行良好!

当我们使用以下命令将应用程序部署并运行到Azure实例时:

mix edeliver build release --verbose
mix edeliver deploy release to production
mix edeliver start production
Run Code Online (Sandbox Code Playgroud)

我们收到一条肯定的确认消息:

EDELIVER HEALTHLOCKER WITH START COMMAND

-----> starting production servers

production node:

  user    : root
  host    : 51.140.86.5
  path    : /home/hladmin
  response: ok


START DONE!
Run Code Online (Sandbox Code Playgroud)

但是当我们netstat -plnt按照check-running-services-on-linux的 …

deployment elixir azure phoenix-framework edeliver

9
推荐指数
1
解决办法
158
查看次数