Ruby2.3.0/Rails5.0:如何让表单submit按钮指定路由提交?
解决Rails全局反馈表单的路由问题
这个问题我之前也碰到过,本质就是表单的提交路径用了相对路径,导致在非首页(比如/posts/13)提交时,浏览器会自动把当前页面的URL和表单路径拼接,最终指向错误的路由。下面给你两个靠谱的解决办法:
方法一:用Rails路由辅助方法(最推荐)
Rails自带的路由辅助方法能帮你生成绝对路径,不管你在哪个页面,表单都能精准指向目标控制器。
首先得确保你在config/routes.rb里已经定义了反馈提交的路由,比如:
# config/routes.rb # 如果你用RESTful路由 resources :feedbacks, only: [:create] # 或者自定义专属路由(更直观) post '/submit-feedback', to: 'feedbacks#create'
然后在你的表单代码里,用form_with(Rails 5+官方推荐的表单助手)指定url参数为路由辅助方法:
<%= form_with model: Feedback.new, url: feedbacks_path, method: :post, local: true do |form| %> <!-- 这里放你的表单字段,比如输入框、文本域 --> <%= form.label :content, "反馈内容" %> <%= form.text_area :content, rows: 3 %> <%= form.submit "提交反馈", class: "btn btn-primary" %> <% end %>
要是你用的是自定义路由/submit-feedback,对应的路由辅助方法是submit_feedback_path,把上面的feedbacks_path换成它就行。这种方式生成的表单action是绝对路径,完全不受当前页面影响。
方法二:手动写绝对路径
如果你不想用Rails的表单助手,也可以直接给表单指定绝对路径的action:
<form action="/feedbacks" method="post"> <!-- 必须加CSRF令牌,不然Rails会拒绝请求 --> <%= hidden_field_tag :authenticity_token, form_authenticity_token %> <!-- 表单字段示例 --> <label for="feedback_content">反馈内容</label> <textarea name="feedback[content]" id="feedback_content" rows="3"></textarea> <button type="submit">提交反馈</button> </form>
这里要注意,绝对路径一定要以/开头,比如/feedbacks,而不是feedbacks(后者是相对路径),同时别忘了加CSRF令牌,这是Rails的安全机制,缺了会提交失败。
小提醒
因为你的表单是点击图标唤起的弹窗,确保弹窗里的表单代码是正确嵌入到每个页面的,要是用AJAX加载弹窗内容,也要保证生成表单时用了上面两种方法之一,这样不管在哪个页面唤起弹窗,提交路径都是对的。
内容的提问来源于stack exchange,提问作者Mason SB
相关产品推荐
相关产品推荐

