0

モデル画像があります:

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/tags/2 ではなく www.example.com/yellow にリンクするために正しいリソースを作成するにはどうすればよいですか。この場合、「link_to」を含むビューは同じになりますか?

4

2 に答える 2

1

www.example.com/yellowへのルートは特定のリソースを参照していないため、作成できません。その後、競合が発生する可能性があります。'images'というタグがある場合、Railsはwww.example.com/imagesへのURLが特定のタグを参照しているか、画像リソースを参照しているかを認識しません。

私たちができる最善のことは、URLの識別子として名前を使用するリソースを作成することです。これにより、www.example.com / tags /yellowは名前属性として「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の代わりにname属性をルーティングに使用するようになります。link_toを更新する必要はありませんが、タグコントローラーはIDではなく名前でタグを検索する必要があります。

class TagsController < ApplicationController

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

    ...

end
于 2012-09-09T11:55:06.757 に答える
1

to_paramこれは、モデルのメソッドまたはfriendly_idgemで行うことができます。Ryan Bates はこのhttp://railscasts.com/episodes/314-pretty-urls-with-friendlyidに関する完璧なスクリーンキャストを持っています

于 2012-09-09T11:53:42.003 に答える