我正在尝试插入发票结构及其关联的发票项目.我可以插入发票数据,并调用匿名函数来验证,转换和插入每个项目.由于insert/2不会产生返回,如果一个项目未通过验证或插入,如何在仍然能够回滚整个事务的同时获取项目的invoice_id?
我把代码放在我自己的回购中,这里是:
def insertassoc(params) do
Repo.transaction(fn ->
i = Invoice.changeset(params["data"], :create)
if i.valid? do
Repo.insert(i)
else
Repo.rollback(i.errors)
end
insert_include = fn k ->
c = InvoiceItem.changeset(k, :create)
if c.valid? do
Repo.insert(c)
else
Repo.rollback(c.errors)
end
end
for include <- params["includes"] do
insert_include.(Map.merge(include, %{"invoice_id" => ????}))
end
end)
end
Run Code Online (Sandbox Code Playgroud)
以下是我在控制器中使用它的方法:
def create(conn, params) do
case InvoiceRepo.insertassoc(params) do
{:ok, x} ->
json conn, Map.merge(params, %{"message" => "OK"})
{:error, x} ->
json conn |> put_status(400), Map.merge(params, %{"message"
=> "Error"})
end
end
Run Code Online (Sandbox Code Playgroud)
有没有很多最新的例子与Ecto,所以抱歉,如果这些是noob问题;-).有人有想法吗?我尝试将发票插入放在私有函数中,并使用case块来确定主事务是否应回滚,但我无法弄清楚如何从中获取发票ID.
我正在研究一个模型的crud部分,我已经添加了图像支持.理想情况下,如果您正在编辑模型,我想显示图像,我会这样做.
<%= Logo.url({@company.logo, @company}, :thumb) %>
Run Code Online (Sandbox Code Playgroud)
问题是公司变量仅在编辑操作中可用,因为新操作上还有公司,所以我需要检查@company是否已设置.
<%= unless @company do %>
<%= Logo.url({@company.logo, @company}, :thumb) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
问题是,这会产生以下错误.
"分配@company在eex模板中不可用.可用分配:[:action,:changeset]"
我尝试使用is_nil,但同样的错误.
我正在尝试创建一个只有一个文本字段和一个隐藏字段的表单,我将在将数据传递给HTTP API时使用,因此我没有与之关联的模型,并且通过扩展,没有变更.
是否可以这样做并使用form_for或只是编写HTML来创建表单的答案?
假设我想创建一个resources向它添加几个自定义动作,rails中的模拟是:
resources :tasks do
member do
get :implement
end
end
Run Code Online (Sandbox Code Playgroud)
这不仅会给我带来7条标准路线,还会带来1条新路线:
GET /tasks/:id/implement
Run Code Online (Sandbox Code Playgroud)
我怎么能在凤凰城做到这一点?
在Rails中,您可以直接渲染文本,例如 render :text => 'OK'
Elixir/Phoenix中是否有快捷方式直接渲染文本,而无需定义模板或布局?
我找到的最短路是:
defmodule MyApp.PageController do
use MyApp.Web, :controller
def index(conn, _params) do
# the file ok.html.eex contains just the string OK
render conn, "ok.html", layout: false
end
end
Run Code Online (Sandbox Code Playgroud)
是否有更短的方式来呈现"OK",而无需提供模板文件"ok.html"?
在Phoenix中处理多态关联的推荐方法似乎是添加一个包含对其他模式的引用的中间模式:
所以,如果我想用不同种类的动物创建模式,我会这样做:
defmodule Animal do
use Ecto.Model
schema "animals" do
belongs_to(:dog, Dog)
belongs_to(:cat, Cat)
belongs_to(:owner, PetOwner)
end
end
defmodule Dog do
use Ecto.Model
schema "dogs" do
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
end
end
defmodule PetOwner do
use Ecto.Model
schema "pet_owners" do
has_one(:pet, Animal)
end
end
Run Code Online (Sandbox Code Playgroud)
但我也可以使用PetOwner包含二进制字段和类型的模式:
defmodule Dog do
use Ecto.Model
schema "dogs" do
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
end
end
defmodule PetOwner do
use …Run Code Online (Sandbox Code Playgroud) 我正试图给我的表格上课.通过文档查看,似乎没有办法做到这一点,并且你只能传递像这样的名字之类的东西
form_for @changeset, @action, [name: :search], fn f -> %>
有没有办法在类中传递作为一个选项,所以我的表单html元素可以有一个类?也许是这样的?
form_for @changeset, @action, [class: 'form-horizontal'], fn f ->
我正在挖掘凤凰源代码,但似乎无法找到任何东西.
我在凤凰城使用addict:1.0.3,我已经按照README指南在我的应用程序中使用登录.当我打电话登录时,我收到以下错误:
[error] #PID<0.2576.0> running MyApp.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /login
** (exit) an exception was raised:
** (UndefinedFunctionError) undefined function: MyApp.Addict.Controller.init/1 (module MyApp.Addict.Controller is not available)
MyApp.Addict.Controller.init(:login)
(my_app) web/router.ex:1: anonymous fn/1 in MyApp.Router.match/4
(my_app) lib/phoenix/router.ex:255: MyApp.Router.dispatch/2
(my_app) web/router.ex:1: MyApp.Router.do_call/2
(my_app) lib/my_app/endpoint.ex:1: MyApp.Endpoint.phoenix_pipeline/1
(my_app) lib/plug/debugger.ex:90: MyApp.Endpoint."call (overridable 3)"/2
(my_app) lib/phoenix/endpoint/render_errors.ex:34: MyApp.Endpoint.call/2
(plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
(cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
Run Code Online (Sandbox Code Playgroud) 我尝试了以下内容
def index(conn, _params) do
Logger.debug conn
......
Run Code Online (Sandbox Code Playgroud)
但我明白了
protocol String.Chars not implemented for %Plug.Conn
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过Apex,但那也没有用.
ERROR 22001(string_data_right_truncation):类型字符变化的值太长(255)
我理解(并假设)字符串将限制为一定数量的字符; 但是,我不确定哪种类型最适合这种情况.
我应该使用什么类型的凤凰框架博客的"内容"部分?
数据将是文本段落,不能限制大小.
提前致谢.