از Phoenix.HTML.Form می توان بدون Ecto استفاده کرد؟


#1

با درود خدمت شما . بنده دو سایت دارم یکی وب سرویسم هست که Json و دیگری که فونیکس هست HTML یا همان قسمت فرونت من می باشد

من از Json وب سرویسم یک سری داده ها می گیرم به این صورت

"category_versions": [
                {
                    "title": "1.0",
                    "id": "08cdfa55-41e2-4117-bca3-167f0222a3db"
                },
                {
                    "title": "1.1",
                    "id": "f39826df-ed82-4b26-834d-7a6002f03ecc"
                }

حالا اومدم ایت اطلاعات رو در یک سکلت باکس به شرح زیر قرار دادم .

<form action="" method="get">
          <select name="version" class="form-control" id="exampleFormControlSelect1" onchange="this.form.submit()">
            <%= for el <- category_versions do %>
              <%= if el["id"] == correct_version_id do %>
                <option value="<%= el["id"] %>" selected><%= el["title"] %></option>
              <% else %>
                <option value="<%= el["id"] %>"><%= el["title"] %></option>
              <% end %>
            <% end %>
          </select>
        </form>

این فرم من الان به صورت فرم معمولی html می باشد و برای بنده نیز کار می کند ولی مشکل من از اینجاست که من می خواستم از

https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html

استفاده کنم مثلا به شرح زیر

<%= form_for category_versions, changelog_path(@conn, :changelog, "easyblog"), fn f -> %>
 <label>
    Name: <%= text_input f, :title %>
 </label>
<% end %>

ولی ارور زیر رو داشتم

Request: GET /changelog/easyblog
** (exit) an exception was raised:
    ** (Protocol.UndefinedError) protocol Phoenix.HTML.FormData not implemented for [%{"id" => "08cdfa55-41e2-4117-bca3-167f0222a3db", "title" => "1.0"}, %{"id" => "f39826df-ed82-4b26-834d-7a6002f03ecc", "title" => "1.1"}]. This protocol is implemented for: Plug.Conn

آیا اصلا بدون Ecto می شه از این مورد استفاده کرد یا من مجبورم که از فرم معمولی خود html پایه استفاده کنم من در سایت html خودم هیچ چیزی رو ذخیره نمی کنم و دیتابیسی ندارم و هرچیزی رو از کاربر می گیرم برای سایت وب سرویسم می فرستم

متفرقه: راستی من ممکن هست لینک بدم در این بخش CSRF استفاده نکردم

لینک نمونه الان داره کار می کنه

http://localhost:9991/changelog/easyblog?version=08cdfa55-41e2-4117-bca3-167f0222a3db

#2

بخاطر اینه که Phoenix.Ecto پروتوکل Phoenix.HTML.FormData رو پیاده میکنه، میتونی خودت بدون Phoenix.Ecto این کارو انجام بدی اما واقعا مشکل چیه؟ اگر به نکته اصلی اشاره کنی بهتره


#3

نکته اصلی اینکه من اصلا نیازی به حتما استفاده کردن فرم از طریق فونیکس دارم یا خیر چون همین الان دارم کارمو با html معمولی انجام می دم

بعد از انتخاب نسمه از سمت چپ


#4

خب اگربه FormData نیازی ندای از همون html استفاده کن، خیلی هم کار خوبیه. اگر هم به form helper حتما نیاز داری از Phoenix.HTML.Form استفاده کن ولی conn@ باید اولین ارگومان form_for باشه


#5

درست نشد؟


#6

توماج جان به همون صحبت شما گوش دادم و همون فرق اورجینال html رو قرار دادم دیگه دنبال فرم خود فونیکس نرفتم


#7

اوکی، اما اگر conn رو به عنوان ارگومان اول بدی درست میشه, الان csrf روی فرم معمولی فعاله؟


#8

حتما تست می کنم ولی خیر روی فرم فعال نیست . چون من به کاربر ممکنه لینک مستقیم بدم . یا در بیرون سایت لینک بزارم به همین ترتیب فعالش نکردم یعنی نیاز هم نبود .

کاربر با این فرم یک پارامتر که uuid هست رو به تابع اکشنی که مدنظره می فرسته و اون تابع اون آیدی رو به وب سرویسم می فرسته.

وب سرویسم می یام اطلاعات درخواستی رو پس می دهد .
حالا لازم به ذکر هست اگر طرف توکن داشته باشه اطلاعات بر اساس دسترسیش دوباره برگشت داده می شه.

توکن رو که تایم داره تو مروگر خود کاربر سشن می کنم که در هر درخواست چک می کنم اگر nil بود که هیچی دسترسی ثبت نام نکرده اطلاعاتش می یاد

اگر nil نبود که می فرسته به وب سرویس user اگر تصدیق شد می فرسته به وب سرویس cms من و اونجا اطلاعات دوباره بر اساس دسترسی می یاد

به این صورت عمل کردم توماج جان. فکر می کنید در منطق کلی چیزی اشتباه کردم به نظرتون؟


#9

اگر سیستم شما با این روش کار میکنه حتما درسته، و در کل بنظر منطقی میاد اما منظور من این بود که چطور از فرم محافظت میکنی، اگر لازم نیست که خب خیلی هم خوبه


#10

درود توماج جان . من ازت خواهش می کنم اگر وقت کردید و براتون ممکن بود جایی دیدید که مشکوک هست لطفا بهم بگید اولین تجربه من بود در این چنین ساختار حتما اشتباهات زیادی داشتم و خواهم داشت

چون جایی ورودی کاربر ثبت نمی شه و فقط فراخوانی می شه مثل get که برای دریافت id یک مطلب گرفته می شه و از دیتابس خوانده می شه. در سایت گرافیکی ازش مراقبت نکردم بلکه در وب سرویس cms اومدم اونجا ولیدیشن اینا رو نوشتم مثلا چک کردم آیا وجود داره یا مثلا آیا UUID که کاربر داره می فرسته درسته یا خیر و همینطور سطح دسترسی که بخشی از اون دسترسی رو هم در سرویس api gateway خودم بررسی کردم

ممنونم ازت


#11

نه، چیز خاصی نیست