برنامه نویسی

شکل تو در تو ریل (نگین جدید با محرک)

فرم‌های تودرتو، فرم‌هایی هستند که مدل‌ها و ویژگی‌های تودرتو را به یک شکل مدیریت می‌کنند. به عنوان مثال یک پروژه با وظایف خود یا یک فاکتور با موارد خط آن.

قبل از Rails 6، Cocoon انتخاب خوبی برای ایجاد فرم های تو در تو پویا است. اما Cocoon برای کارکرد خوب به jQuery نیاز دارد، این یک کتابخانه بسیار قدیمی در فریمورک‌های frontend امروزی است.
هنگامی که Stimulus منتشر شد، به توسعه دهندگان Rails پیشنهاد می شود که از Stimulus به عنوان کتابخانه جاوا اسکریپت در پروژه های خود استفاده کنند. بنابراین، من یک جواهر برای مدیریت فرم‌های تودرتو پویا با Stimulus JS ایجاد کردم.

فرم های تودرتو پویا را مدیریت کنید، مانند Cocoon، اما با استفاده از StimulusJS

نصب و راه اندازی

Gem را نصب کنید و با اجرای زیر به Gemfile برنامه اضافه کنید:

یا داخل Gemfile موارد زیر را اضافه کنید

$ gem 'rondo_form', '~> 0.2.1'

وظیفه نصب را اجرا کنید:

$ rails g rondo_form:install

استفاده

مثلا داریم Project مدل، که دارد has_many رابطه با Task مدل:

rails g scaffold Project name:string description:string
rails g model Task description:string done:boolean project:belongs_to

نمونه با SimpleForm

در شما projects/_form جزئي:

<%= simple_form_for(@project) do |f| %>
  <div class="form-inputs">
    <%= f.input :name %>
    <%= f.input :description %>
  </div>

  <h3 class="text-xl mt-4">Tasks</h3>
  <div class="my-2" data-controller="nested-rondo">
    <%= f.simple_fields_for :tasks do |task| %>
      <%= render "task_fields", f: task %>
    <%

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Rondo Form آسان برای استفاده است، آن را به همان نام helper برچسب به عنوان cocoon دارد: link_to_add_association، link_to_remove_association.
این جواهر برای کار کردن نیازی به وابستگی‌های JS ندارد، وقتی تحت فرمان اجرا می‌کنید، تولید می‌شود nested_rondo_controller.js در شما app/javascript/controllers/ پوشه:

rails g rondo_form:install 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و این کنترلر را به صورت خودکار به index.js وارد کنید.

import NestedRondoController from "./nested_rondo_controller"
application.register("nested-rondo", NestedRondoController)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

باید اضافه کنید data-controller="nested-rondo" به یک عنصر، که می پیچد fields_for و link_to_add_association یاور.
مثلاً مدل Project را داریم که دارد has_many ارتباط با مدل وظیفه
در شما projects/_form جزئي:

<%= simple_form_for(@project) do |f| %>
  <div class="form-inputs">
    <%= f.input :name %>
    <%= f.input :description %>
  </div>
  <h3>Tasks</h3>
  <div data-controller="nested-rondo">
    <%= f.simple_fields_for :tasks do |task| %>
      <%= render "task_fields", f: task %>
    <% end %>
    <div class="links">
      <%= link_to_add_association "Add Task", f, :tasks %>
    </div>
  </div>
  <%= f.button :submit %>
<% end %>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در شما _task_fields جزئي:

<div class="nested-fields">
  <%= f.input :description %>
  <%= f.input :done, as: :boolean %>
  <%= link_to_remove_association "Remove Task", f %>
</div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این نمونه را با سنگ SimpleForm ساختم، اما ایده با فرم استاندارد Rails یکسان است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا