Rails 7表单中基于选择值渲染局部视图的最优方案(Turbo Frame)
在Rails 7中用Turbo Frame实现工作流专属字段动态渲染
你的思路完全正确,仅用Turbo Frame就能实现这个需求,不需要额外引入Stimulus或Turbo Streams,具体实现步骤如下:
1. 改造表单结构,引入Turbo Frame容器
把原有的局部视图渲染逻辑替换为Turbo Frame,并给下拉选择器绑定Turbo Frame的触发属性:
<%= form_with(model: @post, url: posts_path) do |form| %> <%= form.label :workflow %> <%= form.select :workflow, options_for_select(@workflow_options), {}, data: { turbo_frame: 'workflow-properties' } %> <%# 用Turbo Frame包裹工作流专属字段区域,动态拉取对应内容 %> <%= turbo_frame_tag 'workflow-properties', src: workflow_properties_path(workflow: @role.workflow.presence) do %> <% if @role.workflow.present? %> <%= render partial: "#{@role.workflow}_properties", locals: { properties: @role[:workflow_properties] } %> <% end %> <% end %> <%= form.submit "Create Post" %> <% end %>
2. 添加控制器动作与路由
首先在对应控制器中新增处理工作流字段渲染的动作:
# posts_controller.rb def workflow_properties workflow = params[:workflow] # 根据选中的workflow获取对应属性数据,这里替换成你的业务逻辑 @properties = @role.present? ? @role[:workflow_properties] : {} if workflow.blank? render plain: '', layout: false return end render partial: "#{workflow}_properties", locals: { properties: @properties }, layout: false end
然后在routes.rb中添加对应路由:
get '/posts/workflow_properties', to: 'posts#workflow_properties', as: 'workflow_properties'
3. 核心逻辑说明
- 下拉选择器的
data-turbo-frame属性会让选项变更时,自动触发Turbo Frame的内容更新 - Turbo会请求Frame的
src地址(带上选中的workflow参数),控制器返回对应局部视图的纯HTML - Turbo Frame会自动替换自身内部的内容,实现无刷新动态加载工作流专属字段
内容的提问来源于stack exchange,提问作者Ahmed Gasanov
相关产品推荐
相关产品推荐

