标签: phoenix-framework

如何在 Elixir 中映射和减少地图列表

有什么好方法可以映射和减少长生不老药的列表并将其转换为新列表。

要求: 1. 找到具有相同id 的地图: 2. 合并“role”键的值(即收集所有唯一值)。3. 对于所有其他映射(列表元素),不执行任何操作。

list = [%{"id": 1, "role": ["A", "B"]}, %{"id": 2, "role": ["B", "C"]}, %{"id": 1, "role": ["C", "A"]} ]
Run Code Online (Sandbox Code Playgroud)

需要在以下列表中进行转换:

ans_list = [%{"id": 1, "role": ["A", "B", "C"]}, %{"id": 2, "role": ["B", "C"]}]
Run Code Online (Sandbox Code Playgroud)

functional-programming elixir phoenix-framework

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

仅在加入 Phoenix 时验证某些频道

如何更改此代码以连接到不需要身份验证的通道,同时仍然允许在某些通道上进行身份验证?

phoenix.js:701 WebSocket 连接到“ws://localhost:4000/socket/websocket?token=&vsn=1.0.0”失败:WebSocket 握手期间出错:意外的响应代码:403

用户套接字.ex

defmodule App.UserSocket do
  use Phoenix.Socket

  ## Channels
  channel "collection:*", App.CollectionChannel

  ## Transports
  transport :websocket, Phoenix.Transports.WebSocket
  # transport :longpoll, Phoenix.Transports.LongPoll

  # Socket params are passed from the client and can
  # be used to verify and authenticate a user. After
  # verification, you can put default assigns into
  # the socket that will be set for all channels, ie
  #
  #     {:ok, assign(socket, :user_id, verified_user_id)}
  #
  # To deny connection, return `:error`.
  #
  # See …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework phoenix-channels

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

VM892:1 未捕获语法错误:JSON 中位置 0 处出现意外标记 e

我目前正在开发用 Elixir 编写的 phx / phoenix API。我使用 React.js 创建了一个 API 前端。但是,我在浏览器的 JS 控制台中收到以下错误消息。

我已经使用 Postman 成功创建了一个用户,所以我 99% 确定错误不是与 phx 项目有关,而是与 React 项目有关。

我的前端后端都托管在 github 上。.env需要在 React 项目的根目录中创建一个文件,其中包含以下行:

REACT_APP_API_URL=http://localhost:4000/api
Run Code Online (Sandbox Code Playgroud)

并正在按照以下教程进行工作。

任何和所有的帮助将不胜感激。

错误信息

json elixir reactjs phoenix-framework

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

Phoenix:未找到路由的默认路径

让我们看一下基本的路由器:

...
scope "/", Backend do
  pipe_through [:browser, :with_session]

  get "/", PageController, :index
end
...
Run Code Online (Sandbox Code Playgroud)

调用http://localhost:4000/login会引发默认的“Phoenix.Router.NoRouteError”。处理这种情况的最佳方法是什么?离开默认的 Phoenix 错误页面?重定向到索引页?未找到重定向到自定义页面?

如何将任何未知路由重定向到单个路径?

redirect router elixir phoenix-framework

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

phoenix 是否有与 Rails 的 schema.rb 等效的模式转储?

Rails 的schema.rb是获取数据库状态参考的一种非常方便的方法。我可以直接进入 pg 或 mysql 客户端并描述表以获得相同的信息,但它不太方便。

Elixir / Ecto 是否有类似的功能或方式来生成模式表示?

elixir ecto phoenix-framework

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

查询 has_many 关联 - Ecto、Phoenix

我正在尝试查询属于我的系统中特定用户的所有联赛。

数据设置如下所示:

用户模型:

has_many :users_leagues, Statcasters.UsersLeagues
has_many :leagues, through: [:users_leagues, :league]
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,我有一个 has_many through 关联用户和联赛。

我正在尝试获取用户附加的所有联赛的列表。

在 Rails 中,它看起来像这样:user.leagues它将加载所有附加了当前用户 ID 的联赛。

我如何使用 Ecto、Elixir 和 Phoenix 做到这一点?

elixir ecto phoenix-framework

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

从 __module__ 外部调用 Genserver

调用函数时,如果找不到所需的数据,我想重试该函数。我想在函数失败后 10 秒后重试。

目前的实施:

调度程序

def check_question do
    case question = Repo.get_by(Question, active: true, closed: false) do

    question when not(is_nil(question)) ->
      case ActiveQuestion.ready_for_answer_status(question) do
        n when n in ["complete", "closed"] ->
          question
            |> Question.changeset(%{ready_for_answer: true, closed: true})
            |> Repo.update()
      end
    _ ->
      Process.send_after(Servers.Retry, :update, 10_000)
    end
  end
Run Code Online (Sandbox Code Playgroud)

基因服务器:

defmodule Servers.Retry do
  use GenServer
  require IEx

  def start_link do
    GenServer.start_link(__MODULE__, %{})
  end

  def init(state) do
    {:ok, state}
  end

  def handle_info(:update, state) do
    Scheduler.check_question()
    {:noreply, state}
  end
end
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,如果不满足 case 语句,我将尝试重试该函数。但这并不完全有效。

输出: …

elixir gen-server phoenix-framework

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

Plug.Conn.resp/3 中没有匹配的函数子句

在使用 Guardian 验证针对 JWT 令牌的 GET 请求后,我尝试使用 JSON 进行响应。

我的测试:

  describe "Show user if authenticated" do
    setup %{conn: conn} do
      {:ok, %User{} = user} = Riders.create_user(@create_attrs)
      {:ok, jwt, claims} = Bikefit.Guardian.encode_and_sign(user)
      IO.inspect claims
      conn = put_req_header(conn, "authorization", "Bearer #{jwt}")
      {:ok, conn: conn, user: user}
    end

    test  "and return user if token is valid", %{conn: conn, user: user} do
      email = user.email
      conn = get conn, current_user_path(conn, :current)
      response = json_response(conn, 200)
      IO.puts "---------- test response--------"
      IO.inspect response
      assert %{"email" => …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework guardian

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

Ecto 在关联上运行

我运行这样的查询:

query = from q in MY.Model, preload: [:accoc], where: q.accoc_field in [10, 11]
Repo.all(query)
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

** (Ecto.QueryError) iex:32: field `accoc_field` in `where` does not exist in schema MY.Model in query:
Run Code Online (Sandbox Code Playgroud)

所以,基本上我正在尝试编写一个查询,例如:

select * from my_model m join assoc a on m.assoc_id = a.id where a.assoc_field in (10, 11)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用 Ecto 中的联接来编写上述查询,但是在使用预加载时如何做到这一点?

elixir phoenix-framework

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

仅附加表查询的 Ecto JOIN 复杂性

我正在尝试使用仅附加语义查询 Ecto 表,因此我想要给定 ID 的完整行的最新版本。这里描述了该技术,但简而言之:我想使用一个获取 ID 的最新时间的子查询来连接一个表本身。在 SQL 中,这看起来像:

SELECT r.*
FROM rules AS r
JOIN (
  SELECT id, MAX(inserted_at) AS inserted_at FROM rules GROUP BY id
) AS recent_rules
ON (
  recent_rules.id = r.id
  AND recent_rules.inserted_at = r.inserted_at)
Run Code Online (Sandbox Code Playgroud)

我在 Ecto 中很难表达这一点。我尝试过这样的事情:

maxes =
  from(m in Rule,
    select: {m.id, max(m.inserted_at)},
    group_by: m.id)

from(r in Rule,
  join: m in ^maxes, on: r.id == m.id and r.inserted_at == m.inserted_at)
Run Code Online (Sandbox Code Playgroud)

但尝试运行它时,我遇到了限制:

连接中的查询只能有where查询中的条件

建议maxes一定只是一种SELECT _ FROM …

append elixir ecto phoenix-framework

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