Rails中使用link_to调用控制器方法并保持当前路径的实现问题及路由报错咨询
没问题!你的需求完全可以实现,我来一步步帮你搞定
先解决眼前的路由错误
你现在遇到的Missing :controller key on routes definition报错,是因为路由配置里只写了get 'click',没告诉Rails这个请求要交给哪个控制器的哪个方法处理。改一下路由就好:
# config/routes.rb # 明确指定给Products控制器的click动作 get 'click', to: 'products#click' # 要是想更符合Rails的REST风格,也可以写成这样 get 'products/click', to: 'products#click'
改完后可以跑一下rails routes命令,确认路由已经正确关联上了。
核心:实现「点击后页面路径不变」
普通的link_to点击会触发页面跳转,路径肯定会变。要保持路径不变,得用AJAX异步请求——简单说就是在不刷新页面的情况下偷偷调用后端方法。
改页面里的链接
给link_to加个remote: true选项,Rails就会自动用AJAX发送请求:
<%= link_to "Click", click_path, remote: true %>
注:如果用了上面第二种路由写法(products/click),路由辅助方法名会变成products_click_path,具体看rails routes的输出就行
完善控制器的click方法
因为是AJAX请求,控制器需要返回JS格式的响应(要是不需要前端做任何操作,返回空响应也可以):
# app/controllers/products_controller.rb def click puts "click called!!!" # 不需要前端更新的话,直接返回成功状态就行 head :ok # 要是想给用户点反馈,比如弹个提示,可以用下面这段 # respond_to do |format| # format.js # end end
如果选了返回JS响应,记得在app/views/products/目录下建一个click.js.erb文件,写点前端逻辑:
// app/views/products/click.js.erb alert('点击成功!后端的click方法已经被调用啦~');
最后验证一下
- 重启你的Rails服务器
- 打开index页面,点"Click"链接
- 看服务器终端,会看到
click called!!!的打印,同时页面没跳转,地址栏路径完全没变
完美解决你的需求!
内容的提问来源于stack exchange,提问作者Diwanshu Tyagi
相关产品推荐
相关产品推荐

