我需要能够生成随机url安全字符串,以便我可以在链接中使用它们(比如发送到用户电子邮件的激活链接),那么我该如何生成呢?有没有办法只使用Elixir或我必须使用一些库?
作为Elixir和Web领域的新手(没有Web框架经验),我想知道什么是Plug?据我所知,Cowboy是一个Web服务器(虽然在Erlang,而不是Elixir),而Phoenix是一个用于构建Web应用程序的框架,但是插件是从哪里进来的?它是两者之间的抽象层,还是与Phoenix相同的抽象层中的插件系统?
我有一个用户模型和一个聊天模型.直观地,多个人将在任何时间属于同一个聊天组,每个人可以拥有许多聊天组.因此聊天组必须属于多个人user_id的.
我的聊天组和用户的架构是:
schema "chatGroups" do
field :name, :string
has_many :messages, Message
belongs_to :user, User
timestamps
end
schema "users" do
field :name, :string
has_many :chatGroups, ChatGroup
timestamps
end
Run Code Online (Sandbox Code Playgroud)
任何建议如何处理这个?
我需要一个具有某种逐步逻辑的函数,我想知道如何制作一个.我们以站点上的登录过程为例,所以我需要以下逻辑:
1)电子邮件存在?是的 - >继续; 否 - >返回错误
2)电子邮件至少有5个字符?是的 - >继续; 否 - >返回错误
3)密码存在?是的 - >继续; 否 - 返回错误
等等 ...
为了实现这一点,我通常会使用一个return语句,以便如果电子邮件不存在,我退出执行该函数并使其返回错误.但是我在Elixir找不到类似的东西,所以我需要一个建议.我现在能看到的唯一方法是使用嵌套条件,但也许有更好的方法?
我有这个已经运行并向上游发送的原始迁移:
create table(:videos) do
add :url, :string
add :title, :string
add :description, :text
add :user_id, references(:users, on_delete: :nothing)
timestamps
end
create index(:videos, [:user_id])
Run Code Online (Sandbox Code Playgroud)
现在我希望将外键user_id改为级联删除,这样当用户被删除时,他的所有相关视频也将被删除.
我尝试过以下迁移:
alter table(:videos) do
modify :user_id, references(:users, on_delete: :delete_all)
end
Run Code Online (Sandbox Code Playgroud)
但这会引发错误:
(Postgrex.Error) ERROR (duplicate_object): constraint "videos_user_id_fkey" for relation "videos" already exists
Run Code Online (Sandbox Code Playgroud)
如何根据我的要求制定将更改此外键的迁移脚本?
UPDATE
我最终得到了以下解决方案:
def up do
execute "ALTER TABLE videos DROP CONSTRAINT videos_user_id_fkey"
alter table(:videos) do
modify :user_id, references(:users, on_delete: :delete_all)
end
end
def down do
execute "ALTER TABLE videos DROP CONSTRAINT videos_user_id_fkey" …Run Code Online (Sandbox Code Playgroud) 尝试使用Elixir + Phoenix创建一个应用程序,它将能够处理"浏览器"和"api"请求以处理其资源.
是否可以这样做而不必做那样的事情:
scope "/", App do
pipe_through :browser
resources "/users", UserController
end
scope "/api", App.API as: :api do
pipe_through :api
resources "/users", UserController
end
Run Code Online (Sandbox Code Playgroud)
这意味着必须创建两个控制器,这些控制器可能具有相同的行为,除了它将使用浏览器管道呈现HTML ,例如JSON,用于api管道.
我想的可能就是Rails respond_to do |format| ...
通常mix.test清理测试数据库,但它不起作用.
这可能是因为我正在玩制作users架构,但不想使用我制作的东西,所以我摆脱了它.然后我重新开始为用户创建了一个与第一个不同的新模式.
当我再次尝试运行混合测试时,出现了一个错误,即某些字段不存在,应该存在新模式.
是否可以使用某些命令在控制台的不同端口上本地启动一些Phoenix应用程序mix phoenix.server --port=4001?当然,这个不起作用,但也许有类似的方法.
我首先注意到一个带有尾随感叹号/爆炸(!)的函数,同时浏览Phoenix教程(在Incoming Events部分)
def handle_in("new_msg", %{"body" => body}, socket) do
broadcast! socket, "new_msg", %{body: body}
{:noreply, socket}
end
Run Code Online (Sandbox Code Playgroud)
尾随感叹号是什么意思?它有什么用吗?我一直在寻找并尝试寻找,但我不确定我是否使用了正确的条款.到目前为止,似乎只有作为约定的函数会在失败时引发错误,但总是意味着它总是意味着.
我看到它的唯一提及出现在Dave Thomas的"Programming Elixir"中:
Identifiers in Elixir are combinations of upper and lower case ASCII
characters, digits, and underscores. Function names may end with a
question mark or an exclamation point.
Run Code Online (Sandbox Code Playgroud)
而且在文档它提到:
Notice that when the file does not exist, the version with ! raises an
error. The version without ! is preferred when you want to handle …Run Code Online (Sandbox Code Playgroud) 如何在给定的ID列表中查找帖子?
这不起作用:
posts = Post |> where(id: [1, 2]) |> Repo.all
Run Code Online (Sandbox Code Playgroud)
Rails中的示例:
Post.where({ id: [1, 2]})
# SELECT * FROM posts WHERE id IN (1, 2)
Run Code Online (Sandbox Code Playgroud)