ruby-on-rails – url_for定制RESTful资源(复合键;不只是id)

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – url_for定制RESTful资源(复合键;不只是id)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定以下资源定义:
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的混乱是一个死胡同.

解决方案只能在Rails 3.x中工作,但我不想使用任何插件.

解决方法

如何修复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

猜你在找的Ruby相关文章