给定以下资源定义:
map.resources :posts,:except => [:show] map.post '/:year/:month/:slug,:controller => :posts,:action => :show
我可以使用这个语法使url_for为我工作:
<%= link_to @post.title,post_url(:year => '2010',:month => '02',:slug => 'test') %>
但是有没有办法使这项工作?
<%= link_to @post.title,@post %>
目前它抛出了这个错误:
No route matches {:year=>#<Post id: 1,title: "test",(...)>,:controller=>"posts",:action=>"show"}
显然,它将@post对象传递给第一个路由参数(看起来像一个Rails错误…).但我可以为我工作吗?我会补充说,与default_url_options的混乱是一个死胡同.
解决方法
如何修复postController的url_for?可能不是非常优雅,但它是干,事情应该工作.
# app/controllers/posts_controller.rb class PostsController < ApplicationController protected def url_for(options = {} ) if options[:year].class.to_s == "Post" obj = options[:year] options[:year] = obj.year options[:month] = obj.month options[:slug] = obj.slug end super(options) end end