Rails 5视图中能否无需点击按钮通过AJAX自动渲染局部视图?
当然有办法实现!你完全可以借助Rails自带的UJS(Unobtrusive JavaScript)特性,不用写复杂的自定义JS,也不需要用户点击按钮,就能自动加载远程内容。下面给你两个最贴合需求的方案:
方案一:用隐藏表单自动提交(完全依托UJS能力)
这个方案利用Rails UJS对表单的AJAX支持,通过一个隐藏表单在页面加载时自动提交,把远程内容加载到指定容器里,几乎不用自己写JS逻辑:
<!-- 1. 隐藏的自动提交表单,配置remote:true和目标容器 --> <%= form_tag another_model_path(@model), method: :get, remote: true, style: 'display: none', data: { type: 'html', target: '#content-container' # 指定内容要插入的容器 } do %> <% end %> <!-- 2. 用来承载加载内容的容器 --> <div id="content-container"></div> <!-- 3. 一行极简JS触发表单提交(标准DOM操作,不算自定义逻辑) --> <script> document.addEventListener('DOMContentLoaded', () => { document.querySelector('[data-target="#content-container"]').submit(); }); </script>
然后在对应的控制器动作里,直接返回要渲染的局部视图即可:
def show @model = YourModel.find(params[:id]) # 返回不带布局的局部视图,UJS会自动把它插入到指定容器 render partial: 'path/to/your/partial', layout: false end
方案二:用Rails UJS内置的Rails.ajax方法
如果觉得表单方式有点繁琐,也可以直接调用Rails UJS提供的Rails.ajaxAPI,这是官方封装好的AJAX工具,不算自定义JS:
<!-- 承载内容的容器 --> <div id="content-container"></div> <!-- 调用Rails.ajax自动发起请求 --> <%= javascript_tag do %> Rails.ajax({ url: "<%= j another_model_path(@model) %>", type: "GET", dataType: "html", success: function(htmlContent) { document.getElementById('content-container').innerHTML = htmlContent; } }); <% end %>
控制器的写法和方案一完全一样,返回不带布局的局部视图就行。
注意事项
确保你的Rails项目已经引入了UJS:
- Rails 5及之前版本默认包含
rails-ujs - Rails 6+版本需要在
application.js里导入@rails/ujs并初始化
这两个方案都完全满足你的需求:不用点击按钮、依托Rails原生能力(类似remote: true的思路)、不需要复杂的自定义JS。
内容的提问来源于stack exchange,提问作者Gorodscy Fernando
相关产品推荐
相关产品推荐

