Rails 为什么用 link_to 比直接写 a 标签更 “好”

nilisnil · 2012年12月06日 · 最后由 gaicitadie 回复于 2012年12月06日 · 3627 次阅读

如题,看到有文章提到说用<%= link_to 'xxx', xxx_path %>比标签更容易维护之类的,不是太明白。http://blog.xdite.net/posts/2011/12/04/misunderstanding-about-render/

同理,是不是 rails 其他的 tag helper 也是。

似乎很多前端都不太屑于用这套东西。有人能分析下吗

我记得 XDite 的意思应该是 link_to 能保证出来的 HTML 代码不会有错误(比如:少一个 或 结尾)

当然这个我保留意见,我觉得,缺少闭合的情况很少会出现

但是项 xxx_path (url_helper) 这类方法生成 URL 是一定要用的!如果你直接写 "/users", 等你需要重构,或者需要把 users 换成 members 的时候,那就悲剧了,你得用全局查找,而且某些情况下,全局查找无法准确的处理(比如带有很多奇葩的参数),而如果你用 url_helper 的方式,这个事情就很简单,修改 routes.rb 就可以了。

#1 楼 @huacnlee 感谢回复,你说到的确实是一部分原因,但是他的意思好像在 a 中使用 url_helper 也一样不易维护,不明白为什么

link_to 还可以直接用对象参数,更加有 "model driven" 的感觉

但在 slim 里用 a 就比 link_to 容易写,也更快...

a href=xxx_path data-method='delete'

不过最近一段时间一直是用 link_to 方法来生成链接标签的,这种做法在 a 标签有多种属性的时候优势会特别明显

比如:

<%= link_to "登录", new_session_path, :class => "btn btn-success btn-large", :rel => "facebox", :data => { :name => "foo" } %>

#1 楼 @huacnlee 我有个问题,不知道是不是我理解的有问题。 如果说 开始的时候,我是 users,然后到处写了一些 new_user_path, edit_user_path, users_path。但是后来需要改成 members,new_user_path 也还是需要改的吧,还是说 new_user_path 还可以用,只是需要在 config/routes 中做些工作就可以继续呢?

匿名 #6 2012年12月06日

#5 楼 @woaigithub 我看书上写的可以定义别名。应该效果是一样的。你可以把 routes 打印出来看看。

#6 楼 @leonkaiyu 别名估计可以,难道是 :as =>

匿名 #8 2012年12月06日

resources :members, :path => :users, :as => :users

我看书上例子是这样讲的。

参考:http://guides.rubyonrails.org/routing.html#overriding-the-named-helpers

#3 楼 @luikore 也许你说的原因吧,谢谢

以前我不怎么用 Link_to 等标签 现在,一般都会用 link_to 原因主要有:第一,便于维护,比如我修改了某一个 route,不需要逐行修改;第二,按照约定,严格执行 Rails 规范

前端对 link_to 不感冒正常,link_to 写法符合 ruby way,未必符合前端的 way。第二,a 标签也可以使用 xxx_path

#4 楼 @huacnlee

属性多了在 slim 里用 a 更简单,attribute 写法和 html 几乎一致,而且前端很容易用 .btn-success 之类的方式搜出元素定义的代码,如

a.btn.btn-success.btn-large href=new_session_path rel="facebox" data-name="foo" 登录

#12 楼 @luikore 就是得用 Slim,我是 ERB 的拥护者

link_to 在特定条件下更容易达到整齐划一的效果,比如

<%= link_to "新闻", news_path %>
<%= link_to "博客", bokes_path %>
<%= link_to "论坛", topics_path %>
<%= link_to "求职", jobs_path %>
<%= link_to "问答", asks_path %>
需要 登录 后方可回复, 如果你还没有账号请 注册新账号