javascript - rails simple_form 中的动态下拉列表

标签 javascript ruby-on-rails json ajax

我的 Rails 应用程序中有一个简单的 has_many 和 belongs_to 关系。我正在使用 simple_form 并希望根据用户选择的值动态更改下拉选项。

模型

 class Processor < ApplicationRecord
   has_many :processor_bank_accounts
 end

 class ProcessorBankAccount < ApplicationRecord
   belongs_to :processor
 end

表单输入

<%= simple_form_for [@customer, @transaction] do |f| %>
<%= f.error_notification %>

<div class="form-inputs">
  <%= f.input :status, :collection => ["payment request"], include_blank: false %>
  <%= f.input :processor, collection: @processors ,label_method: :name,value_method: :id,label: "Processor" , include_blank: false %>
  <%= f.input :processor_bank_account, collection: @bank_accounts , label_method: :bank_name, value_method: :id, label: "Processor Bank Account" , include_blank: true %>
  <%= f.input :tcurrency, collection: @currencies, include_blank: false, label: 'currency' %>
  <%= f.input :amount, as: :decimal, label: 'amount' %>
</div>

<div class="form-actions text-center">
  <%= f.button :submit, "Add transaction", class: "form-button"%>
</div>
<% end %>

所以基本上,我需要根据用户选择的处理器来填充 processor_bank_account 下拉列表。在控制台中,这只是:ProcessorBankAccount.where(processor: processor)。

需要使用 JS 加载选项并认为我需要使用 JSON 但不确定从这里去哪里

最佳答案

实现此目的的一种方法是使用 jQuery 对 Controller 操作进行 AJAX 调用,然后让 Rails 通过 erb 模板处理其余部分。

因此,在您的页面上,使用表单通过 AJAX 调用操作,例如:

<script>
    $(document).ready(function() {
        $('#processor_id').on('change', function() {
            $.ajax({
                url: '/transactions/get_processor_bank_accounts',
                type: 'GET',
                data: {
                    processor_id: this.value
                },
                dataType: 'script',
                error: function() {
                    alert('An error occurred retrieving bank accounts for the selected processor.');
                }
            });
        });
    });
</script>

注意,#processor_id 是您的下拉控件的 ID。

接下来,在您的 Controller 中实例化您的操作中的银行帐户:

def get_processor_bank_accounts
  @processor_bank_accounts = ProcessorBankAccount.where(processor_id: params[:processor_id])
end

最后简单地创建一个 View 来负责重新填充您的下拉列表:

$select_list = $('#processor_id');
$select_list.empty();

<% @processor_bank_accounts.each do |pba| %>
  $select_list.append($('<option value="<%= pba.id %>"><%= pba.name %></option>'));
<% end %>

关于javascript - rails simple_form 中的动态下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52382831/

相关文章:

javascript - 将多个 && 条件合并为 1

javascript - Microsoft Edge 中流的新响应

ruby-on-rails - 如果找不到@import怎么办?

html - 在 Rails ERB 中混合 HTML 和非 HTML 字符串

php - Laravel - 排序后从集合中响应 JSON 将项目索引作为对象键

javascript - 未捕获的类型错误 : undefined is not a function - GravityForms AJAX Spinner

Javascript正则表达式匹配单词并计算每个单词出现的次数

ruby-on-rails - 带有设计的 Turbo-Rails 不会始终如一地重定向 Rails 6.1.3 设计 4.7.3 Turbo Rails 0.5.9

javascript - AngularJS:根据 JSON 数据更改 ng-model

json - .json 文件架构验证的最佳工具