私のエリクシール/フェニックスのバックエンドには2つのproduct
コントローラがあります。まず - APIエンドポイント(pipe_through :api
)と第二のコントローラpiping through :browser
:backx APIとしてのredux-formとelixir/phoenixの添付ファイル(シリアル化の問題)
# router.ex
scope "/api", SecretApp.Api, as: :api do
pipe_through :api
resources "products", ProductController, only: [:create, :index]
end
scope "/", SecretApp do
pipe_through :browser # Use the default browser stack
resources "products", ProductController, only: [:new, :create, :index]
end
ProductController
がエリキシルフォームヘルパーによって生成されたフォームからの要求を処理し、いくつかの添付ファイルを受け付けます。すべてはそれで大丈夫です。ここでは、アクションと、このアクションによって処理のparamsを作成することです:ログから
def create(conn, %{"product" => product_params}) do
changeset = Product.changeset(%Product{}, product_params)
case Repo.insert(changeset) do
{:ok, _product} ->
conn
|> put_flash(:info, "Product created successfully.")
|> redirect(to: product_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
のparams(私はエリキシルコードで画像のアップロードを処理するためのarcを使用しています)
[debug] Processing by SecretApp.ProductController.create/2
Parameters: %{"_csrf_token" => "Zl81JgdhIQ8GG2c+ei0WCQ9hTjI+AAAA0fwto+HMdQ7S7OCsLQ9Trg==", "_utf8" => "✓",
"product" => %{"description" => "description_name",
"image" => %Plug.Upload{content_type: "image/png",
filename: "wallpaper-466648.png",
path: "/tmp/plug-1460/multipart-754282-298907-1"},
"name" => "product_name", "price" => "100"}}
Pipelines: [:browser]
Api.ProductController
はredux-fromからの要求を処理します。ここでは、このアクションによって処理されているアクション、ビューとのparamsは、次のとおりです。
# action in controller
def create(conn, %{"product" => product_params}) do
changeset = Product.changeset(%Product{}, product_params)
case Repo.insert(changeset) do
{:ok, _product} ->
conn
|> render("index.json", status: :ok)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", changeset: changeset)
end
end
# product_view.ex
def render("index.json", resp=%{status: status}) do
%{status: status}
end
def render("error.json", %{changeset: changeset}) do
errors = Enum.into(changeset.errors, %{})
%{
errors: errors
}
end
[info] POST /api/products/
[debug] Processing by SecretApp.Api.ProductController.create/2
Parameters: %{"product" => %{"description" => "product_description", "image" => "wallpaper-466648.png", "name" => "product_name", "price" => "100"}}
Pipelines: [:api]
[info] Sent 422 in 167ms
は、画像がこれらのparamsと一緒に保存することができないため、アクションは、422個の状態で失敗し作成します。バックエンドコードからイメージにアクセスできないという私の問題は、私はFileListオブジェクトとして自分のJSコード内に持っています。私はバックエンドコードに画像を渡す方法を理解していません。ここでは、この添付ファイルがJSコード(FileList、アップロードされた画像に関する情報を含む)でどのように表現されているかを示します。
value:FileList
0: File
lastModified: 1381593256801
lastModifiedDate: Sat Oct 12 2013 18:54:16 GMT+0300
name: "wallpaper-466648.png"
size: 1787293
type: "image/png"
webkitRelativePath: ""
IのみWebkitRelativePathいる(私は画像へのパスを有する第1のコントローラの場合には、 "/ TMP /プラグ-1460 /マルチ-754282-298907-1")と私は何ができるかわかりませんこのJSオブジェクトと、このJSオブジェクトが表す実際のイメージにアクセスする方法(ここではファイルのアップロードについてはredux-form referenceです)。
お手伝いできますか?エリクシルに画像を見つける方法を説明するには?私はバックエンドにJSコードを使用して添付ファイルを提出したいと思います(なぜなら非同期検証のための興味深い機能がたくさんあるからです)。それはあなたのログから
写真のような静的資産は、 'priv/static /'の下にあるべきです。あなたは 'priv/static/tmp/plug-1460/multipart-754282-298907-1'の下にファイルを見つけることができますか?そうでない場合は、そこに画像を保存してみてください。 – tkowal
バックエンドコードからイメージにアクセスできないという私の問題は、私はFileListオブジェクトとして自分のJSコード内に持っています。私はバックエンドコードに画像を渡す方法を理解していません。しかし、priv/static/tmpには何もありません –