如何根据表单提交参数的格式来做出响应
Ruby on Rails会自动根据URL请求的格式来响应(无论是以 .csv 这样的文件扩展名,还是以 ?format=csv 这样的查询参数)。
但我想创建一个表单,让你可以选择格式,例如像这样:
<select name="format"><option>csv</option></select>
我本来可以用JavaScript在 DOM中自动修改表单的action,但我希望有一个更干净、在服务器端的解决方案。
另一种替代方法是不要使用 respond_to,而是自己做一个切换,但我觉得值得问问,是否能接入Rails的做法。
我尝试把格式信息放进Rails的 params哈希中,但似乎并不会生效。还有其他办法吗?
params[:format] = params[:form][:format]
解决方案
一个刚才想到的点子是,不是使用 <select>,而是用一个按钮把请求发到所选格式的URL。示例:
<button formaction="?format=csv">
但这并不是我追求的用户体验。
备选方案
我猜那个表单是用来下载一份报告之类的。
我会做一个简单的GET表单,带一个下拉框
<%= form_with url: reports_path, method: :get do |f| %>
<%= f.select :format, [["CSV", "csv"], ["PDF", "pdf"]] %>
<%= f.submit "Download" %>
<% end %>
提交这个表单会让浏览器跳转到 /reports?format=csv,或用户选择的目标地址。控制器通过读取 params[:format] 来推断响应的格式,因为它存在,所以你可以在控制器中使用经典的 respond_to 方法。它在不需要任何JavaScript,也不用手动检查格式参数的情况下应该就能工作
def index
# ...
respond_to do |format|
format.html
format.csv { do_something }
format.pdf { do_something_else }
end
end
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。