小编Vys*_*san的帖子

Vim与tmux发生冲突

在此输入图像描述

NERDTree在tmux会话中如图所示.分割窗口时存在同样的问题.但是现在我正在使用powerline这次Vim状态在tmux中变得很糟糕(在图片中看到状态行的中间部分).怎么了?

vim tmux vim-powerline

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

在elixir phoenix应用程序中创建后台作业的正确方法

  def create(conn, %{"data" => %{"attributes" => user_params}}) do

    changeset = User.changeset(%User{}, user_params)

    case Repo.insert(changeset) do
      {:ok, user} ->
        UserMailer.send_welcome_email(user)
        conn
        |> put_status(:created)
        |> render("show.json", model: user)
      {:error, changeset} ->
        conn
        |> put_status(:unprocessable_entity)
        |> render(MyApp.ChangesetView, "error.json", changeset: changeset)
    end
  end
Run Code Online (Sandbox Code Playgroud)

在此控制器操作中,UserMailer.send_welcome_email是同步的,请求等待.

我想让它异步,所以产生了这样的过程

spawn_link(fn ->
  UserMailer.send_welcome_email(user)
end)
Run Code Online (Sandbox Code Playgroud)

请求不会等到邮件发送完毕.

  • 虽然它有效但是它是正确的方法吗?
  • 这些过程是否有可能成为孤儿,或者他们只是在立即执行后死亡?
  • 我们应该创建一个Supervisor吗?
  • 我们应该使用像https://github.com/akira/exq这样的库吗?(我觉得即使spawn_link失败了,也记录在我们的凤凰日志中,它会这样做)

elixir phoenix-framework

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

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
查看次数

如何测试从不同频道或控制器对频道进行的广播?

我有一个驱动程序频道,它将其位置广播到供应商频道.

defmodule MyApp.DriverChannel do
    #...

    def handle_in("transmit", payload, socket) do
      MyApp.Endpoint.broadcast! "vendors:lobby", "track", payload
      {:noreply, socket}
    end
end

defmodule MyApp.DriverChannelTest do

  #....

  test "location broadcasts to vendors:lobby", %{socket: socket} do
    push socket, "transmit", %{"hello" => "all"}
    assert_broadcast "track", %{"hello" => "all"}
    # Want something like this
    # assert_broadcast "vendors:lobby", "track", %{"hello" => "all"}
  end

end
Run Code Online (Sandbox Code Playgroud)

这个断言会失败,因为它只检查广播DriverChannel,如何断言广播VendorChannel,我查看了源代码,似乎没有选项传递channel_nameassert_broadcast宏.

[另一个注意事项]我也有控制器播放,如果我知道答案,我也可以断言那些广播!:)

elixir phoenix-framework

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

如何重新启动崩溃的监督任务

{:ok, tas} = Task.Supervisor.start_link(restart: :transient, max_restarts: 4)
a = 1
Task.Supervisor.async_nolink(tas, fn -> IO.puts "#{a}..." end)
Task.Supervisor.async_nolink(tas, fn ->
  IO.puts "Not Restarting :( "
  1 = 2
end)
a =  a + 1
Task.Supervisor.async_nolink(tas, fn -> IO.puts "#{a}.." end)
a =  a + 1
Task.Supervisor.async_nolink(tas, fn -> IO.puts "#{a}.." end)
Run Code Online (Sandbox Code Playgroud)

该选项restart: :transient似乎没有任何影响.

我很少有任务 Task.async(fn(x) -> fetch_info(x) end使http请求获得多个资源,并且有超时错误.重新尝试那些失败的任务,而不是使用try,这将是很好的rescue.

我认为async_nolink是最接近我没有崩溃的过程.如果没有办法使用Task,我们是否有一个更简单的方法使用Supervisor启动多个进程,一旦他们的工作完成就存在,如果失败就重新启动它们?

elixir erlang-otp

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

使用ecto 2.0更新多个记录

我可以在ecto 2.0中插入多个记录:

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

iex(2)> App.Repo.insert_all App.Category, categories
Run Code Online (Sandbox Code Playgroud)

是否可以一次更新多个记录?

iex(1) > category = App.Repo.all(App.Category) |> hd

iex(2) > changeset = App.Category.changeset(category, %{name: "test"})

iex(3)> App.Repo.insert_all App.Category, [changeset]
Run Code Online (Sandbox Code Playgroud)

我有一个场景,我会在抓取外部页面后每天插入或更新类别.好像MultiEcto 2.0中有功能.关于如何解决这个问题的任何指示?

elixir ecto phoenix-framework

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

标签 统计

elixir ×5

phoenix-framework ×4

ecto ×2

erlang-otp ×1

tmux ×1

vim ×1

vim-powerline ×1