Rails 自动路由是挺方便,不过在 Views 里面还能获得到 path 吗?

gaicitadie · 2018年04月01日 · 最后由 adamshen 回复于 2018年04月02日 · 1487 次阅读

我 rake routes,只能得到

Prefix Verb     URI Pattern                            Controller#Action
       GET      /                                      front#index
       GET|POST /:controller(/:action(/:id(.:format))) :controller#:action

然后在 views 中只能把链接写死了

<a href="/User/login">点此登陆</a>

其实这样写也不麻烦,只是我亲爱的 rubymine 会有语法警告,背景变成屎黄色,当然也不会有自动完成了

2 楼 已删除
jasl 回复

自动路由也可以认为是一种约定啊。

gaicitadie 回复

理论上只要技术可行你可以任意来搞,但是在所有的人为约定里有一种叫做 最佳实践

有安全隐患,楼主想用就用吧。

Rei 回复

有哪方面的安全隐患?请说来听听。thinkPHP 的自动路由用的挺爽的

登出不用 delete 方法,而用 get,肯定不安全,用 get 意味着浏览器一访问,就登出了。

hfpp2012 回复

感谢分享看法,刚才我也遇到这个困扰了,写了个 before_action

def only_post_method
    if request.method != 'POST'
        render plain: '只允许post提交'
    end
end

before_action :only_post_method, :only => [:create, :update]
gaicitadie 回复

你继续往后做,会发现更多的坑的,然后加上更多的类似这样的补丁来缓解,架构腐败就是这样开始的

感谢各位大虾的指点,用动态路由果然越往后坑越多。
1、首先 rails 日志里已经警告 5.2 以后的版本将不支持动态路由匹配
2、用我自己实现的那种 before_action 过滤 post 方法,会导致需要过滤的 action 越来越多,自己都搞混乱了。还不一定安全。
3、不用动态路由,rubymine 的自动提示又回来了,比自动路由还方便

至于 rubymine 之前的路由提示为什么会失效呢?这里有一个小插曲,我创建 controller 的时候命名忘了加 s,结果生成了 user_controller.rb,而不是 users,这样也能运行,但是不够 rails way 了,结果再 rubymine 里面的路由提示就失效了,现在改回来了,rubymine 的提示又回来了。

gaicitadie 回复

约定大于配置

实际做项目的时候,会用到 member、scope、subresource 等等,光动态路不够用。这样还要写额外的路由,那还不如直接用 dsl。这样万一有其他人接手项目,一看 routes.rb 就知道项目大概有哪些功能,对他十分友好。还有用自动路由,只要有方法没有设置为 private,就可以直接输入 url 调用。假如你继承了 devise 的 controller 自己实现了一些 action,我就可以自己合成 url 和 param 来直接访问 devise 的 action 绕过去。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号