如何在Rails 3中制作自定义_url助手?

usr*_*kxx 5 ruby ruby-on-rails ruby-on-rails-3

我有这个

match '/news/:year/:id' => 'news#show', :as => :news
Run Code Online (Sandbox Code Playgroud)

我想用:

<%= link_to n.title, n %>
Run Code Online (Sandbox Code Playgroud)

(返回/news/n.id/current_news.id而不是/news/n.date.year/n.id)

我想摆脱这个:

<%= link_to n.title, news_url(n, :year => n.date.year) %>
Run Code Online (Sandbox Code Playgroud)

怎么做?

mik*_*ike 5

您可以覆盖生成路径的帮助程序

将这样的内容添加到NewsHelper模块应该可以解决这个问题:

def news_path(news)
    "/news/#{news.date.year}/#{news.id}"
end
Run Code Online (Sandbox Code Playgroud)

然后<%= link_to n.title, n %> 会给你想要的新闻对象的网址

  • 在这种特殊情况下它是一种有效的方法,但它不可测试,并且它不会扩展到使用URL助手的地方,直接注入rails路由助手 (3认同)

Mid*_*ire 1

您可以在辅助文件中执行类似的操作:

def custom_link_to(*args)
  name         = args[0]
  obj          = args[1]
  if obj.is_a?(News) # or whatever class you are using
    link_to(name, news_url(obj, :year => obj.date.year))
  else
    link_to(args)
  end
end
Run Code Online (Sandbox Code Playgroud)

那么在你看来:

<%= custom_link_to n.title, n %>
Run Code Online (Sandbox Code Playgroud)

或者您可以使用一些类似的代码覆盖link_to辅助方法。我更喜欢 custom_link_to 方法,因为它不太可能搞砸其他link_to调用。但如果你做得对,你肯定可以逃脱惩罚。