我有一个模特图片:
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”的视图是否相同?
答案 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