Rails 7中GET方法表单无法设置turbo_stream格式的问题
在Rails 7中实现GET方法的Turbo Stream表单
要让GET请求的form_with以turbo_stream格式发送请求,需要手动指定请求格式,并确保路由和控制器支持该格式的响应,具体步骤如下:
1. 修改表单代码
在form_with中明确指定请求格式为turbo_stream,同时保留method: :get:
<%= form_with url: search_orders_path(format: :turbo_stream), method: :get do |f| %> <!-- 你的表单字段,比如搜索输入框 --> <%= f.text_field :keyword %> <%= f.submit "搜索" %> <% end %>
也可以直接通过format参数传递(效果与URL中指定一致):
<%= form_with url: search_orders_path, method: :get, format: :turbo_stream do |f| %> <!-- 表单内容 --> <% end %>
2. 确保路由支持格式指定
在config/routes.rb中,确保search_orders的GET路由允许格式后缀:
get 'search_orders', to: 'orders#search', format: true
3. 控制器处理Turbo Stream响应
在对应的控制器动作(比如OrdersController#search)中,添加turbo_stream格式的响应处理:
def search # 执行你的搜索逻辑,示例: @orders = Order.where("name LIKE ?", "%#{params[:keyword]}%") respond_to do |format| format.turbo_stream # 会渲染对应路径的turbo_stream模板(如app/views/orders/search.turbo_stream.erb) format.html # 保留HTML响应,兼容非Turbo场景 end end
原理说明
Rails 7中form_with默认启用remote: true,但对GET请求默认会以html格式发送。通过指定format: :turbo_stream,会修改请求的Accept头为text/vnd.turbo-stream.html,同时在URL中带上.turbo_stream后缀(路由允许的情况下),让Rails识别并处理Turbo Stream格式的响应。
内容的提问来源于stack exchange,提问作者banh
相关产品推荐
相关产品推荐

