我有一个凤凰路线,我想将一些表格数据发布到,但是表格中有大约4个字段是可选的(表格由最终用户构建,因此这些字段可能不存在于POST有效载荷中)
在路线的凤凰控制器中,您将如何处理?
例如:
我的表格有
Field1,
Field2
Field3 (optional)
Field4 (optional)
Field5 (optional)
Run Code Online (Sandbox Code Playgroud)
POST表单必须始终具有Field1,Field2但可以包含其他字段的任意组合.
所以到目前为止我的控制器代码是这样的:
def create(conn, %{"field1" => field1, "field2" => field2) do
end
Run Code Online (Sandbox Code Playgroud)
如何让其他3个可选?如果我将它们全部添加到那时它们将是必需的,我不希望为每个可能提交的表单创建一个函数,因为它似乎有点过分.
我有一些问题,拌匀,MIX_ENV=prod用mix phoenix.server,它失败的开始.在Linode的Ubuntu 14.04上运行所有最新的(Elixir 1.0.5,Phoenix 0.14.0),除了Erlang(17.x,17.3).
$ MIX_ENV=prod PORT=80 mix phoenix.server
{"Kernel pid terminated",application_controller,"{application_start_failure,elirc_site,{{shutdown,{failed_to_start_child,'Elixir.ElircSite.Endpoint',{shutdown,{failed_to_start_child,'Elixir.Phoenix.Endpoint.Server',{shutdown,{failed_to_start_child,{ranch_listener_sup,'Elixir.ElircSite.Endpoint.HTTP'},{shutdown,{failed_to_start_child,ranch_acceptors_sup,{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]},{supervisor,init,1,[{file,\"supervisor.erl\"},{line,243}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,306}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,239}]}]}}}}}}}}},{'Elixir.ElircSite',start,[normal,[]]}}}"}
Run Code Online (Sandbox Code Playgroud)
具体来说,我认为这部分是追踪.
{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]}
Run Code Online (Sandbox Code Playgroud) 在单个Phoenix模板中需要定义的JavaScript模块的标准方法是什么?
我不希望模块需要在任何地方,但在这个模板中.
这是我正在使用的文件的片段.
let TrendChart = {
//... some JS module code here
}
Run Code Online (Sandbox Code Playgroud)
这有标准的app load/require.
...
<script src="<%= static_path(@conn, "/js/app.js") %>"></script>
<script>require("web/static/js/app")</script>
...
Run Code Online (Sandbox Code Playgroud)
<!-- what do i put in this template to require / load the TrendChart module code? -->
<!-- i don't want it required globally, so i don't want to put it in the app.html.eex file -->
Run Code Online (Sandbox Code Playgroud)
我真的在寻找一种@inner在主布局中有两个块的方法.一个用于内容,另一个用于在内容之后加载其他JavaScript项目.
类似ASP.NET MVC中的部分.(我知道我知道!)
所以最终app.html.eex将会是这样的:
... …Run Code Online (Sandbox Code Playgroud) 我想在我部署的phoenix app上调试一个问题.有没有一种简单的方法来启用文件记录?
与rails创建uat.log和production.log的方式类似
在这个小卫生功能的Phoenix/Elixir应用程序中,当用户没有输入电子邮件时,我会遇到问题.
我正在使用结构来处理数据.一个简单的卫生功能(现在)只是剥离空白并更新结构(地图).到目前为止,它的工作很好,但是当领域email是nil,我得到一个错误.
** (FunctionClauseError) no function clause matching in String.Unicode.strip/1
Run Code Online (Sandbox Code Playgroud)
所以我引入了一个guard子句来检查这种情况,然后只清理用户名.
defmodule MyApp.User do
defstruct username: nil, email: nil, password: nil, hashed_password: nil
# Sanitizing input without guard clause
def sanitize_user(user)do
%{user | username: String.strip(user.username), email: String.strip(user.email)}
end
# Sanitizing input with guard clause
def sanitize_user(user) when is_nil(user.email) do
%{user | username: String.strip(user.username)}
end
def sanitize_user(user) when is_binary(user.email) do
%{user | username: String.strip(user.username), email: String.strip(user.email)}
end
end
Run Code Online (Sandbox Code Playgroud)
现在我在编译时遇到错误:
** (CompileError) web/models/user.ex:54: cannot invoke remote function Access.get/2 …Run Code Online (Sandbox Code Playgroud) 我在我的虚拟博客凤凰应用程序中创建了一组验收测试.他们之间有一些重复的逻辑我想转移到帮手模块以保持干燥.
这是目录结构:
test/acceptance/post
??? create_test.exs
??? delete_test.exs
??? helpers.exs
??? index_test.exs
??? update_test.exs
Run Code Online (Sandbox Code Playgroud)
该helpers.exs文件是我想坚持重复验收测试逻辑的地方.它看起来像:
defmodule Blog.Acceptance.Post.Helpers do
def navigate_to_posts_index_page do
# some code
end
end
Run Code Online (Sandbox Code Playgroud)
然后在我的一个测试文件中,比方说index_test.exs,我想导入帮助程序模块以使用它的方法:
defmodule Blog.Acceptance.Post.IndexTest do
import Blog.Acceptance.Post.Helpers
end
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
**(CompileError)test/acceptance/post/index_test.exs:7:模块Blog.Acceptance.Post.Helpers未加载且无法找到
如何在我的测试文件中访问或加载帮助程序模块?
我正在开始我的Elixir/Phoenix之旅并且在我的postgres连接上遇到了一些麻烦.
当我启动我的服务器时,我得到:
$ mix phoenix.server
[error] Postgrex.Protocol (#PID<0.214.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.217.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.218.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.211.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.215.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.219.0>) failed to …Run Code Online (Sandbox Code Playgroud) 我希望逐步将遗留API应用程序移植到Phoenix.理想情况下,我会将应用程序的子域划分为单独的Phoenix应用程序,并将它们托管在不同的服务器节点上.
我希望使用Phoenix频道来促进应用与应用之间的沟通.如何将一个Phoenix应用程序连接到另一个渠道和主题?例如,我想设置一个带有WebSockets的'jobs.foo.com'子域,如:
socket "/ws", Jobs do
channel "jobs:work_orders", WorkOrdersChannel
end
Run Code Online (Sandbox Code Playgroud)
从另一个凤凰应用程序(例如:报告)我想发布/转到该职位频道主题.是否可以Phoenix.Endpoint在Reports中创建Jobs lib,并Jobs.Endpoint在config.exs中配置该url?我可以使用类似于Phoenix.PubSub.subscribe/4名为pubsub端点的东西吗?
我不确定我的想法是否合理.如果有更明智的方法,我愿意接受建议.
- 编辑 -
只是为了澄清我想要完成的事情......我想让一个Phoenix应用程序通过WebSocket客户端连接到另一个.这将允许我拥有具有不同域逻辑的应用程序,通过频道和共同感兴趣的主题进行通信.
我有一个预编译的ember.js应用程序(fronted-js-framework在这里不重要),它基本上由一个带有index.html文件的文件夹和一些js/css资产组成.
我把这个文件夹放在我的凤凰应用程序中的/ priv/static下,并试图让路由服务它...到目前为止没有成功.我在凤凰版0.17.1(与1.0 afaik相同).我按顺序尝试了以下步骤:
only: ~w(...)过滤器.
def index(conn, _params) do
redirect conn, to: "/my_app/index.html"
end
get "/my_app", MyCustomController, :index到目前为止,上述步骤均无效,我只得到错误no route found for GET /my_app/index.html.我怎么能解决这个问题?我只想将URL "/my_app"(或者,如果没有其他工作原理"/my_app/index.html")映射到priv/static/my_app/index.html我的凤凰应用程序中的路径.有任何想法吗?
编辑:
我尝试实现的基本工作流程如下:
我有不同的开发人员在其专用文件夹中构建一些ember.js SPA $phoenix_root/apps/.所以我有一个$phoenix_root/apps/my_app带有ember和ember-cli 的开发人员.这个开发人员ember server在开发他的应用程序时使用,并且mix phoenix.server在后台运行,因为phoenix应用程序本身将所需数据公开为RESTful API.
在每个实现的功能,前端开发人员类型之后ember build [...],此任务将整个ember.js前端应用程序编译到一个文件夹中,带有index.html文件和一些资源,并将此文件夹移动到$phoenix_root/web/static/assets/my_app.然后凤凰(或早午餐)触发,并复制这个东西原样来$phoenix_root/priv/static/my_app,随时可以提供像任何其他资产.
关键是能够在单个代码库(凤凰应用程序)中构建一堆孤立的"前端"作为自包含的包,而凤凰应用程序本身还有其他(其他)要做的事情.
因为Frontend-Developers每次都自动生成SPA,所以我非常想避免修改新的index.html文件.在性能方面,将这些SPA作为静态文件提供服务是最好的 - 它们在用户浏览器内自行初始化.
我希望这可以为我这样做添加一些说明.
编辑2:
我现在有一个工作解决方案,请参阅我为演示目的创建的示例repo:https://github.com/Anonyfox/Phoenix-Example-Multiple-SPA-Frontends
凤凰应用程序的必要修改:
endpoint.ex …我试图基于其域获取网站的标识符,但在为其编写插件后,我遇到了一个问题,其中系统中的所有链接都返回根URL内容.
LIB/MyApp的/插头/ request_var.ex
defmodule Myapp.Plug.RequestVar do
import Plug.Conn
@doc false
def init(default), do: default
@doc false
def call(conn, router) do
host = conn.host
if host == "ll.com" || host == "domain1.com" do
slug = "domain1"
else
slug = "domain2"
end
conn |> put_private(:site_slug, slug)
end
end
Run Code Online (Sandbox Code Playgroud)
在lib/myapp/endpoint.ex中
plug Myapp.Plug.RequestVar, Myapp.Router
plug Myapp.Router
Run Code Online (Sandbox Code Playgroud)
这个插头有什么问题吗?
编辑:根据响应修复"if"条件.