如何为标记创建用户友好的路由

时间:2012-09-09 11:43:33

标签: ruby-on-rails ruby-on-rails-3 url routes tagging

我有一个模特图片:

class Image < ActiveRecord::Base
  attr_accessible :description, :name, :size, :image, :tag_ids

  has_many :taggings, :dependent => :destroy
  has_many :tags, :through => :taggings
end

然后我有我的Tag模型:

class Tag < ActiveRecord::Base
  attr_accessible :name
  has_many :taggings, :dependent => :destroy
  has_many :images, :through => :taggings

end

我的routes.rb目前是:

resources :images do
    get 'confirm_destroy', :on => :member
end
resources :tags

现在假设我为图像创建了一些“蓝色”,“红色”和“黄色”标签。在某些页面上,我想显示一个标签列表,然后将它们链接到例如www.example.com/yellow,其中显示标记为黄色的所有图像。此标记列表的视图(haml)当前为:

- @tags.each do |tag|
  = link_to(tag.name, tag)

但它会生成指向www.example.com/tags/2的链接(其中2为tag_id)。

如何创建正确的资源才能链接到www.example.com/yellow而不是www.example.com/tags/2。在这种情况下,带有“link_to”的视图是否相同?

2 个答案:

答案 0 :(得分:1)

您可以在模型中使用to_param方法或使用friendly_id gem执行此操作。 Ryan Bates对此http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

进行了完美的截屏视频

答案 1 :(得分:1)

您将无法创建指向 www.example.com/yellow 的路线,因为这不会引用特定资源,因此可能会产生冲突。想象一下,如果你有一个名为'images'的标签,Rails就不会知道 www.example.com/images 的网址是指特定标签还是图像资源。

我们所能做的最好的事情是创建一个资源,该资源使用该名称作为网址中的标识符,这样 www.example.com/tags/yellow 会将标记显示为“黄色”它的名字属性。

为此,您需要在模型中为Tag定义以下 to_param 方法。

class Tag < ActiveRecord::Base
  attr_accessible :name
  has_many :taggings, :dependent => :destroy
  has_many :images, :through => :taggings

    def to_param
        name
    end
end

这将告诉Rails使用名称属性进行路由,而不是默认的 id 。您的 link_to 不需要更新,但是,您的代码控制器现在需要按名称而不是ID查找标记,如下所示:

class TagsController < ApplicationController

    def show
        @tag = Tag.find_by_name(params[:id])
    end

    ...

end