我可以time_stamp在最后一行返回而不用大括号提取它吗?
{:ok, time_stamp} = Myapp.Repo.insert(changeset) # |> Map.get time_stamp
time_stamp
# {:ok, %Myapp.TimeStamp{__meta__: #Ecto.Schema.Metadata<:loaded>, active: true...}
Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的要求,围绕凤凰城内置的2个服务(现在):
ServiceA负责注册用户.注册用户时,ServiceA广播包含有关新创建用户的信息的消息.现在使用Controller操作中的以下代码完成此操作:
ServiceA.Endpoint.broadcast("activity:all", "new:user", %{email: "test@test.com"})
ServiceB 负责监听所有这些活动广播并与他们合作(基本上建立一个活动源).
我遇到了一个绊脚石,因为我可以看到ServiceA向Redis播放消息(使用Phoenix.PubSub.Redis),但不完全了解如何让订阅者ServiceB处理它...
下面这段代码是据我已经成功地获得,这确实的东西时,广播消息,然后抛出一个例外.
部分订户模块
defmodule ServiceB.UserSubscriber do
def start_link do
sub = spawn_link &(process_feed/0)
ServiceB.Endpoint.subscribe(:user_pubsub, "activity:all")
{:ok, sub}
end
def process_feed do
receive do
params ->
IO.inspect "processing goes here..."
end
process_feed
end
end
Run Code Online (Sandbox Code Playgroud)
例外
[error] GenServer :user_pubsub terminating
** (FunctionClauseError) no function clause matching in Phoenix.PubSub.RedisServer.handle_info/2
Run Code Online (Sandbox Code Playgroud)
我猜我在GenServer某个地方错过了一大堆工作,但似乎无法在网上发现任何暗示在哪里.
我之所以学习灵丹妙药只是因为互联网上的很多文章都很有希望它的响应时间不到一毫秒.我昨天构建了我的第一个应用程序,我发现它的性能比rails更快.发生了什么?
让我来解释一下我的应用 它实现了ecto-secure-password包提供的基本认证机制:
defmodule HelloPhoenix.User do
use HelloPhoenix.Web, :model
use SecurePassword
schema "users" do
field :first_name, :string
field :last_name, :string
field :username, :string
has_secure_password
end
end
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
defmodule HelloPhoenix.SessionController do
use HelloPhoenix.Web, :controller
def create(conn, %{ "session" => %{ "username" => username, "password" => password }}) do
if user = HelloPhoenix.User.authenticate(HelloPhoenix.Repo.get_by(HelloPhoenix.User, username: username), password) do
conn
|> put_session(:user_id, user.id)
|> json(UserSerializer.run(user))
else
conn
|> put_status(422)
|> json(%{})
end
end
end
Run Code Online (Sandbox Code Playgroud)
所以,我正在使用这些命令:
MIX_ENV=prod mix compile
MIX_ENV=prod mix phoenix.server
Run Code Online (Sandbox Code Playgroud)
失败和成功认证的响应时间约为~130ms,而此处的rails响应时间约为150ms.我做错了什么?
我正在尝试获取特定列的总和.我有一个订单模式,字段总数,存储总价格.现在我正在尝试创建一个查询,它将总计所有订单的总价值,但不确定我是否做得对.这是我到目前为止:
def create(conn, %{"statistic" => %{"date_from" => %{"day" => day_from, "month" => month_from, "year" => year_from}}}) do
date_from = Ecto.DateTime.cast!({{year_from, month_from, day_from}, {0, 0, 0, 0}})
revenue = Repo.all(from p in Order, where: p.inserted_at >= ^date_from, select: sum(p.total))
render(conn, "result.html", revenue: revenue)
end
Run Code Online (Sandbox Code Playgroud)
只是<%= @revenue %>在html.eex中调用它.截至目前,它不会返回错误,只是在页面上呈现随机符号,而不是总收入.
我认为我的查询是错误的,但无法找到有关如何使其正常工作的良好信息.任何帮助表示感谢,谢谢!
我试图在页面上做一个简单的登录.每当我尝试将我的页面路由到用户注册时,我收到以下错误.
UndefinedFunctionError at GET /users/new
function Ecto.Changeset.fetch/2 is undefined or private. Did you mean one of:
* fetch_change/2
* fetch_field/2
Run Code Online (Sandbox Code Playgroud)
这个错误似乎来自Changeset,因为每当我注释掉我的Changeset并只渲染一个空的html页面时它就可以工作.任何帮助将非常感激.
网/控制器/ user_controller.ex
defmodule Test.UserController do
use Test.Web, :controller
alias Test.User
def new(conn, params) do
changeset = User.changeset(%User{})
render conn, "new.html", changeset
end
def show(conn, %{"user_id_hash" => user_id_hash}) do
render conn, "user_index.html", %{layout: {Test.LayoutView, "react.html"}}
end
def create(conn, %{"user" => user_params}) do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
{:ok, user} ->
conn
|> put_flash(:info, "#{user.username} thank you for signing …Run Code Online (Sandbox Code Playgroud) 如何在架构中添加功能?我想创建用于动态地将字段添加到模型模式的函数.例:
def func do
# .. loop to create dynamic fields
field :street, :string
end
schema "objects" do
func
end
... Error:
** (CompileError) web/models/objects.ex:12: undefined function func/0
Run Code Online (Sandbox Code Playgroud) 我发现bullet gem是一个非常有用的工具,用于在Rails应用程序中捕获慢速数据库查询.是否有类似的工具Ecto/ Phoenix有助于通知您N + 1和其他慢查询?
我有一个phoenix应用程序,但是我需要在每次后端更改后手动重新启动服务器。 code_reload已启用并plug CodeReload正在使用。
我尝试生成一个新项目(mix phoenix.new --no-brunch),尝试了不同的编辑器(vim,vscode,atom和textedit),尝试始终plug CodeReload在端点中进行操作,并尝试手动将其设置MIX_ENV为dev-但是,更改文件时,项目仍无法编译。我应该如何追踪问题所在?
CodeReload不工作时运行mix phoenix.server或iex -S mix phoenix.server
我想在有效检查后返回,然后转到其他页面(1)。然而,似乎之后,然后呈现索引页面(2)。
def index(conn, %{"id" => id}) do
unless Model.is_valid!(id) do
conn
|> redirect(to: other_path(conn, :other)) #(1)
end
# More process are after this.
render(conn, "index.html") #(2)
end
Run Code Online (Sandbox Code Playgroud)
似乎一次重定向了其他页面,但之后继续进行。我怎样才能像其他语言一样以回程停止?
在phoenix中查看配置文件时,如果我创建这样的配置:
config :myapp,
http: 4000
Run Code Online (Sandbox Code Playgroud)
我可以像这样在我的代码中引用该键:
Application.fetch_env!(:myapp, :http)
Run Code Online (Sandbox Code Playgroud)
有时配置似乎特定于某个模块,例如下面的MyApp.Endpoint。
这只是将配置分为几类吗?如果我也需要如何在代码中引用下面的http端口?
config :myapp, MyApp.Endpoint,
http: [port: 4000],
debug_errors: true
Run Code Online (Sandbox Code Playgroud)