标签: phoenix-framework

将操作推送到消息队列以便在需要时进行处理

我的头衔不是很好,因为我发现很难用小片段来解释我想要的东西......所以我会深入尝试!

我正在使用Phoenix Web框架编写Elixir应用程序.

我想要做的是:

  • 调用一个web路由,凤凰处理并传递给控制器
  • 控制器用于启动要切换到消息队列的进程
  • 资源可用时要处理的队列中的最新项(即CPU /内存/等)

该过程不需要返回到Web路由(即其异步)

我知道如何通过使用消息队列(Beanstalk,RabbitMQ,sidekiq)来处理其他语言,并将"作业"交给工作人员,然后编写工作人员来处理队列中的作业.

但是......我知道在Elixir中它默认排队,因为所有内容都被推入"邮箱"(在YouTube视频中看到它:p)

但是我找不到任何合适的代码示例来说明如何让控制器(在phoenix中)产生一个异步进程,该进程将在消息队列中处理.

有没有人知道任何体面的资源,显示我正在寻找什么,或者是否有人有任何代码片段,将给我一个基本的描述如何做到这一点.

谢谢 :)

编辑:

正如评论中所提到的,我已经创建了一个基本教程,介绍如何在Elixir应用程序中启动和运行Poolboy.我希望它对人们有用(并且正确!):)

https://github.com/thestonefox/elixir_poolboy_example

elixir phoenix-framework

8
推荐指数
2
解决办法
2225
查看次数

如何在Phoenix Framework中创建全局视图?

如果我想创建一个模块,其中包含可以在每个模板中访问的函数,并且我可以使用该视图的所有功能(创建标记,使用路由器路径等),那么实现该功能的最佳方法是什么?

简而言之,我如何创建全局视图?

elixir phoenix-framework

8
推荐指数
1
解决办法
1571
查看次数

has_many,通过Ecto的协会

我还在尝试如何处理has_many, through:Ecto中创建/更新关联的问题.我重新阅读了José关于协会和文档帖子,但我仍在努力.

我有的是这个:

网络/模型/ dish.ex

defmodule Mp.Dish do
  use Mp.Web, :model

  schema "dishes" do
    # ...
    has_many :dish_dietary_prefs, Mp.DishDietaryPref, on_delete: :delete_all,
      on_replace: :delete
    has_many :dietary_prefs, through: [:dish_dietary_prefs, :dietary_pref]
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

网络/模型/ dietary_pref.ex

defmodule Mp.DietaryPref do
  use Mp.Web, :model

  schema "dietary_prefs" do
    # ...
    has_many :dish_dietary_prefs, Mp.DishDietaryPref, on_delete: :delete_all,
      on_replace: :delete
    has_many :dishes, through: [:dish_dietary_prefs, :dish]
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

网络/模型/ dish_dietary_pref.ex

defmodule Mp.DishDietaryPref do
  use Ecto.Schema

  schema …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

8
推荐指数
1
解决办法
6971
查看次数

如何在Ecto的迁移中运行更新?

我在我的一个项目中使用PhoenixEcto.

我想在一个表中添加一个列,我希望它是一个NOT NULL列.但是我已经有了一些已存在的数据,所以我决定添加列,将所有行更新为某个值并将列修改为NOT NULL.

我尝试了这两个代码:

  # solution 1
  def up do
    alter table(:channels) do
      add :type, :integer
      Exchat.Repo.update_all("channels", set: [type: 1])
      modify :type, :integer, null: false
    end
  end

  # solution 2
  def up do
    alter table(:channels) do
      add :type, :integer
    end
    Exchat.Repo.update_all("channels", set: [type: 1])
    alter table(:channels) do
      modify :type, :integer, null: false
    end
  end
Run Code Online (Sandbox Code Playgroud)

他们两个都没有工作,我得到的错误如下:

23::40::07.514 [info]  == Running Exchat.Repo.Migrations.AddTypeToChannels.up/0 forward

23::40::07.541 [debug] UPDATE "channels" AS c0 SET "type" = $1 …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

8
推荐指数
1
解决办法
3050
查看次数

insert_all不会使用ecto 2.0创建自动生成的inserted_at

# mix.exs
  defp deps do
    [{:phoenix, "~> 1.1.4"},
      {:postgrex, ">= 0.0.0"},
      {:phoenix_ecto, "~> 3.0.0-rc"},
      {:gettext, "~> 0.9"},
      ...
    ]
  end
Run Code Online (Sandbox Code Playgroud)

安装的ecto版本是 "2.0.0-rc.5"

iex(1)> categories = [%{name: "stackoverflow", url: "stackoverflow.com"}]

iex(2)> App.Repo.insert_all App.Category, categories

** (Postgrex.Error) ERROR (not_null_violation): null value in column "inserted_at" violates not-null constraint

    table: categories
    column: inserted_at

Failing row contains (1, stackoverflow, stackoverflow.com, null, null).
    (ecto) lib/ecto/adapters/sql.ex:176: Ecto.Adapters.SQL.query!/5
    (ecto) lib/ecto/adapters/sql.ex:350: Ecto.Adapters.SQL.insert_all/8
    (ecto) lib/ecto/repo/schema.ex:42: Ecto.Repo.Schema.do_insert_all/6
iex(2)> 
Run Code Online (Sandbox Code Playgroud)

从文档来看,它似乎inserted_at是自动生成的.我应该手动做这部分吗?

schema "categories" do
 field :name, :string
 field :url, :string

 timestamps …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

8
推荐指数
1
解决办法
2420
查看次数

在Phoenix使用SO_REUSEPORT

我对零停机部署系统感兴趣,该系统不使用Elixir/Erlang热升级(由于代码运行时数据迁移的复杂性).

我听说我可以在将服务器绑定到适配器时使用SO_REUSEPORT选项,这样我就可以运行绑定到同一地址和端口的同一应用程序的两个实例.我的意图是在与运行版本1相同的服务器上部署版本2,启动版本2,然后优雅地停止版本1,这应该允许传入连接自然地开始专门连接到版本2.

无论这是否与我的计划完全一致 - 我的意图是测试这种配置,因为它知道它在不同的操作系统上的行为不同 - 我想知道配置Phoenix执行此操作所需的具体步骤,因为这似乎更低 - 内部的级别配置:gen_tcp.

或者,如果有一种方法可以配置OS或Erlang VM以默认启用此选项的所有连接,那就更好了.

erlang network-programming elixir phoenix-framework

8
推荐指数
1
解决办法
394
查看次数

Phoenix Framework - 每个路线的页面标题

在Phoenix Framework中,有一种基于路径/路径设置页面标题的常用技术.或者这只是assign(:page_title, "fred")在我的路由功能中调用正确点的问题?

更新

我最终实现了@ michalmuskala解决方案的变体.我传递了动作名称而不是@view_template:

<title><%= @view_module.title(action_name(@conn), assigns) %></title>
Run Code Online (Sandbox Code Playgroud)

然后在视图模块中,代码如下所示:

def title(:show, assigns), do: assigns.user.name <> " (@" <> assigns.user.user_name <> ")"
def title(:edit, _assigns), do: "Edit Profile"
def title(_action, _assigns), do: "User related page"
Run Code Online (Sandbox Code Playgroud)

上面代码中的最后一个语句是模块的可选"catch all"(我可能只会在转换时执行此操作)

elixir phoenix-framework

8
推荐指数
1
解决办法
1003
查看次数

在Elixir伞应用程序中,应该将logger后端应用程序添加为依赖项?

我有一个Elixir伞形应用程序.伞下的应用程序使用Logger.我想为应用程序添加后端(logger_logstash_backend):logger.所以,我需要deps在混合文件中添加它作为函数的依赖项.

在伞形应用程序的最外层混合文件中,deps功能状态的文档:

此处列出的依赖项仅适用于此项目,无法从apps文件夹中的应用程序访问

这意味着我必须将后端模块添加为伞下每个应用程序的依赖项.但是,这样做会导致几个问题:

  1. 稍后将单个应用程序移出单独的库变得更加困难.

  2. 保护伞下的各个应用程序实际上并不依赖于自定义:logger后端模块.他们没有默认的:console后端.但我想只为prod环境增加一个后端.因此,更多的是跨应用程序问题,我不得不单独为每个应用程序添加依赖项.

你知道更好的策略吗?它是什么?

erlang elixir phoenix-framework

8
推荐指数
1
解决办法
687
查看次数

Elixir/Phoenix - 访问用户的 cookie:conn.cookies vs conn.req_cookies vs conn.req_headers

因此,我正在尝试实现类似 Imgur 的功能,其中非网站成员的用户可以上传,并继续编辑该上传(直到 cookie 被重置)。

查看conn结构体时,有 3 个地方会出现用户的 cookie。

conn.cookies["_APPNAME_key"]
conn.req_cookies["_APPNAME_key"]
List.keyfind(conn.req_headers, "cookie", 0)
Run Code Online (Sandbox Code Playgroud)

这些都返回相同的 cookie(除了最后一个有“_APPNAME_key=COOKIE”与其他 3 个的“COOKIE”)

三者有什么区别?有没有我应该使用的而不是其他的?

elixir phoenix-framework

8
推荐指数
1
解决办法
3158
查看次数

获取LiveView中的当前路径

在正常路线中:

get /index, MyController, :index

Plug.Conn我可以简单地从的 path_info 函数获取路线。

但是,如果我有实时路线,如何检索当前路径?

live /index, IndexLive

elixir phoenix-framework phoenix-live-view

8
推荐指数
2
解决办法
5063
查看次数