ruby-on-rails - Active Admin - 根据第一个下拉菜单刷新第二个下拉菜单,Ruby on Rails

标签 ruby-on-rails ruby sqlite drop-down-menu activeadmin

我在 Ruby on Rails 上使用 Active Admin Gem。我有一个表格,我在其中选择了类别和子类别,然后相应地我必须填写数据。所以我在事件管理资源中添加了 sqlite 创建了两个表。

一切正常,但子类别的下拉列表未根据所选类别进行过滤。

我也是 Ruby 和 RoR 的新手。我不知道如何在选择类别后刷新子类别的下拉列表。

我知道我可以通过 AJAX 和 javascript 做到这一点,但我不知道在哪里编写代码?

此外,在 Active Admin 中是否有任何特定的过滤器可以在没有 ajax 或 javascript 的情况下实现。

任何想法或帮助将不胜感激。

最佳答案

我不知道 Active Admin 中是否有任何特定的过滤器可用,但我用这 3 步的方式解决了它(假设类别 - 是房子,子类别 - 是公寓):

第一步:定义包含ajax请求的助手

(当然,你得在routes.rb中预定义path)

#application_helper.rb
def remote_request(type, path, params={}, target_tag_id)
  "$.#{type}('#{path}',
             {#{params.collect { |p| "#{p[0]}: #{p[1]}" }.join(", ")}},
             function(data) {$('##{target_tag_id}').html(data);}
   );"
end

第 2 步:为 :onchange 操作添加此方法

#admin/inhabitants.rb (DSL with formtastic)

form do |f|
  f.inputs do
  #...
    f.input :house, :input_html => {
        :onchange => remote_request(:post, :change_flats, {:house_id=>"$('#house_id').val()"}, :flat_id)
    }
    f.input :flat
  #...
  end
end

第三步:渲染过滤结果

(你可以渲染部分而不是 :text,我决定把它留在一个 activeadmin 资源文件中)

controller do
  def change_flats
    @flats = House.find_by_id(params[:house_id]).try(:flats)
    render :text=>view_context.options_from_collection_for_select(@flats, :id, :flat_number)
  end
end

关于ruby-on-rails - Active Admin - 根据第一个下拉菜单刷新第二个下拉菜单,Ruby on Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9579402/

相关文章:

ruby - 如何通过 "\r\n"拆分 Ruby 字符串?

python - 创建空白字段并使用 sqlite、python 接收 INTEGER PRIMARY KEY

c++ - 使用 Sqlite3 blob 的 C++ 程序中的 RAM 消耗

mysql - 升级到 Rails 5.2 后 from 子句中缺少表名

ruby-on-rails - Rails 4 中的单表继承

ruby - 将 radix-2 数字字符串数组写入 Ruby 中的二进制文件

ruby-on-rails - "<<"在 ruby​​ 中到底做了什么?

c++ - 插入 SQLite 时如何处理逗号和撇号字符

mysql - Rails 会创建任何连接到 mysql 的连接池吗?它是单线程设计吗?

ruby-on-rails - 为什么将突出显示的结果包装在数组中?