微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rails 使用 Simple_form 嵌套表单将输入的值传递给另一个

如何解决Rails 使用 Simple_form 嵌套表单将输入的值传递给另一个

我的 rails 应用中有一个带有 simple_formstimulusjs 的表单。此表单用于创建新订阅

在这个表单中,我有 2 个使用 simple_fields_for 的嵌套表单。

一个嵌套表单是一个 dummy_selector,它不会在我的数据库中保存任何数据。 这个虚拟选择器有一个包含 3 个选项的集合。 ["aniversary","cardinal","ordinal"]

第二个嵌套表单有几个输入,并将数据保存在数据库中。第一个输入是一个只有两个选项的集合 [“cardinal” “ordinal”].

如果用户点击第一个表单“周年纪念”,则不会发生任何变化,因为它是认选项

如果用户按下选项 cardinal ||第一种形式的序数。多亏了 Stimulus,第二种形式将客户想要的选项保存在 db 中。

这是有效的。

我面临的问题 100% 是可用性问题

假设我将 debit_date 设置为“cardinal” 我遇到的问题是,当我想更新表单并呈现页面时,dummy_selector 出现时没有我之前保存的选项。就可用性而言,它应该会出现。

我已经探测将 debit_date 关联的值传递给 dummy_selector 内的父对象 (base_plan)

<%= f.input :debit_date_dummy_selector,value: f.object.debit_date.date_type %>

如果我在 rails 控制台上测试这个,它会给我正确的选项。但它没有显示在视图中

我也尝试过使用选择器,它给了我我想要的选项,但破坏了其他功能。 (如果我想更改debit_date,则无需更新)

<%= f.input :debit_date_dummy_selector,selector: f.object.debit_date.date_type %>

这是我的 simple_form 代码

Simple_form

            <%= f.simple_fields_for :synthetic_data do |f| %>
              <%= f.input :debit_date_dummy_selector,include_blank: true,collection: debit_date_dummy_selector,input_html: {
                            "data-action": "input->hideable#replace
                                           input->hideable#toggleSelector
                                           input->hideable#check","data-hideable-target": "select replace","data-content-value": "aniversary","data-alternative-value": "cardinal","data-alternative-possible-value": "ordinal"
                                                     } %>
            <% end %>
            <%= f.simple_fields_for :debit_date do |debit_date|%>
              <div class="hidden" >
                <%= debit_date.input :date_type,collection: translate_base_plan_debit_date,input_html: {
                                      "data-hideable-target": "link","data-alternative-possible-value": "ordinal"
                                    } %>
              </div>
              <% if debit_date.object.persisted? %>
                  <div class="hidden" data-hideable-target= "input">
                    <%= debit_date.input :value %>
                  </div>
                <div class="hidden">
                  <%= debit_date.input :_destroy,as: :boolean,input_html: { "data-hideable-target": "check" } %>
                  <% debit_date.object.mark_for_destruction %>
                </div>
              <% else %>
                <div class="hidden" data-hideable-target= "input">
                  <%= debit_date.input :value %>
                </div>
              <% end %>
            <% end %>
          </div>

Stimulusjs 控制器

import { Controller } from "stimulus"

export default class extends Controller {
  static targets = [ "hideable","link","show","remove","select","disable","check","input" ]
  connect() {
    this.hideableTargets.forEach( (e) => {e.classList.add('hidden')});
    this.showTargets.forEach( (e) => {e.classList.remove('hidden')});
    this.removeTargets.forEach( (e) => {e.classList.add('hidden')});
  }

  basic_toggle() {
    this.hideableTargets.forEach( (e) => {e.classList.toggle('hidden')});
  }

  toggle() {
    this.basic_toggle()
    if (this.linkTarget.innerText == this.linkTarget.dataset.initialText) {
      this.linkTarget.innerText = this.linkTarget.dataset.alternativeText
    } else {
      this.linkTarget.innerText = this.linkTarget.dataset.initialText
    }
  }

  toggleSelector() {
    if (this.selectTarget.value == this.selectTarget.dataset.contentValue) {
      this.inputTarget.classList.add('hidden')
    } else {
      this.inputTarget.classList.remove('hidden')
    }
  }

  replace() {
    if (this.selectTarget.value == this.selectTarget.dataset.alternativeValue) {
      this.linkTarget.value = this.linkTarget.dataset.alternativeValue
    } else if (this.selectTarget.value == this.selectTarget.dataset.alternativePossibleValue ) {
      this.linkTarget.value = this.linkTarget.dataset.alternativePossibleValue
    }
  }

  check() {
    if (this.selectTarget.value == this.selectTarget.dataset.contentValue) {
      this.checkTarget.checked = true
    } else {
      this.checkTarget.checked = false
    }
  }

  disableCheckBox() {
    if (this.selectTarget.value == this.selectTarget.dataset.contentValue) {
      this.disableTarget.checked = false
      this.disableTarget.disabled = true
    } else {
      this.disableTarget.disabled = false
    }
  }

  disableinput() {
    if (this.selectTarget.value == this.selectTarget.dataset.contentValue) {
      this.disableTarget.disabled = false
    } else {
      this.disableTarget.disabled = true
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。