You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ruby结合Ajax实现点击下拉菜单加载Partial到指定Div

我来帮你搞定这个下拉菜单加载对应Partial的需求,一步步来:

实现步骤拆解

1. 完善HAML下拉菜单代码,添加标识字段

首先给每个下拉子项加上data-partial属性来存储对应Partial的路径(比直接塞href更清晰,同时href用锚点避免页面跳转):

%li
  %a.dropdown-button.dropdown-menu-kpis{"data-activates" => "SalesDropDown", :href => "#!"}
    %i.material-icons attach_money
    %span Sales
    %i.material-icons right arrow_drop_down
%ul#SalesDropDown.dropdown-content
  %li
    %a{"href" => "#sales-overview", "data-partial" => "sales/overview"} Sales Overview
  %li
    %a{"href" => "#sales-trends", "data-partial" => "sales/trends"} Sales Trends
  %li
    %a{"href" => "#sales-reports", "data-partial" => "sales/reports"} Sales Reports

2. 编写控制器处理Partial渲染

在对应控制器(比如SalesController)里新增一个action,专门用来返回Partial内容,一定要加安全校验,防止恶意路径遍历:

def load_partial
  partial_name = params[:partial]
  # 白名单允许加载的Partial,避免任意文件泄露
  allowed_partials = %w[sales/overview sales/trends sales/reports]
  
  if allowed_partials.include?(partial_name)
    render partial: partial_name, layout: false
  else
    render plain: "Invalid content request", status: :bad_request
  end
end

3. 配置路由

在routes.rb里添加对应路由,让AJAX请求能找到控制器action:

get 'sales/load_partial', to: 'sales#load_partial'

4. 编写JS处理点击事件,加载Partial到目标区域

假设你用来展示Partial的灰色区域div id是partial-container,用jQuery或原生JS实现点击加载:

用jQuery的版本:

$(document).ready(function() {
  $('#SalesDropDown a').click(function(e) {
    e.preventDefault(); // 阻止默认锚点跳转
    const partialPath = $(this).data('partial');
    
    $.ajax({
      url: '/sales/load_partial',
      method: 'GET',
      data: { partial: partialPath },
      success: function(response) {
        $('#partial-container').html(response); // 把Partial内容插入灰色区域
      },
      error: function(xhr) {
        $('#partial-container').html('<p>加载内容失败,请重试</p>');
        console.error(xhr.responseText);
      }
    });
  });
});

原生JS版本(无需jQuery):

document.addEventListener('DOMContentLoaded', function() {
  const dropdownLinks = document.querySelectorAll('#SalesDropDown a');
  const targetContainer = document.getElementById('partial-container');
  
  dropdownLinks.forEach(link => {
    link.addEventListener('click', function(e) {
      e.preventDefault();
      const partialPath = this.dataset.partial;
      
      fetch(`/sales/load_partial?partial=${encodeURIComponent(partialPath)}`)
        .then(response => {
          if (!response.ok) throw new Error('请求失败');
          return response.text();
        })
        .then(htmlContent => {
          targetContainer.innerHTML = htmlContent;
        })
        .catch(error => {
          targetContainer.innerHTML = '<p>加载内容失败,请重试</p>';
          console.error('加载错误:', error);
        });
    });
  });
});

注意事项

  • 确保页面上存在id="partial-container"的div,并且样式设置为灰色区域
  • 白名单校验不能少,绝对不要直接渲染用户传入的路径参数,避免安全风险
  • 如果是Rails 7+项目,也可以用Turbo Streams简化AJAX逻辑,上面的方法兼容所有Rails版本

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:39:31