0

我有一个模型图像:

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

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

然后我有我的标签模型:

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”的视图是否相同?

4

2 回答 2

1

您可以使用to_param模型中的方法或friendly_idgem 来执行此操作。Ryan Bates 有关于这个http://railscasts.com/episodes/314-pretty-urls-with-friendlyid的完美截屏视频

于 2012-09-09T11:53:42.003 回答
1

您将无法创建到www.example.com/yellow的路由,因为它不引用特定资源,随后可能会产生冲突。想象一下,如果您有一个名为“images”的标签,Rails 将不知道www.example.com/images的 url 是否引用了特定标签或图像资源。

我们能做的最好的事情是创建一个资源,它使用名称作为 URL 中的标识符,这样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 使用name属性而不是默认id进行路由。您的link_to不需要更新,但是,您的标签控制器现在需要按名称而不是 ID 查找标签,如下所示:

class TagsController < ApplicationController

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

    ...

end
于 2012-09-09T11:55:06.757 回答