8

Acts_as_taggable_ongemによって管理されるタグのurlスラッグを作成したいと思います。たとえば、http://myapp.com/tags/5のようなURLの代わりに、http //myapp.com/tags/my-tag(「mytag」はタグの一意の名前)が必要です。

自分で作成するモデルでは、通常、モデルのto_paramメソッドをオーバーライドし、モデルに「slug」フィールドを作成して、新しいto_paramメソッドの結果を保存します。ActsAsTaggableOnのタグモデルでこれを実行しようとしましたが、機能しません。

それ以外の場合は、ActsAsTaggableOnのtag.rbクラスにあるものを次のようにオーバーライドできます。

# Overwrite tag class
ActsAsTaggableOn::Tag.class_eval do
  def name
    n = read_attribute(:name).split
    n.each {|word| word.capitalize!}.join(" ")
  end      
end

ただし、同じブロックのto_paramメソッドを次のようなメソッド定義でオーバーライドしようとすると、次のようになります。

def to_param
  name.parameterize
end

Railsは、パラメーター化された名前ではなく整数IDのルートを生成して応答します。実際、コンソールで次のようなことを試してみると

ActsAsTaggableOn::Tag.find(1).to_param

オーバーライドされたto_paramメソッドの結果ではなく、整数IDが返されます。

自分のアプリケーションコードでそれを実行できる方法があれば、gemをフォークしてカスタマイズしたくありません。ありがとう。

4

5 に答える 5

15

スラッグを管理するためにfriendly_id(https://github.com/norman/friendly_id)gemを使用しています。タグのスラッグを作成する方法はあなたの方法と似ていますが、少し簡単です。

次のコードを使用して、初期化子act_as_taggable_on.rbを作成しました。

# act_as_taggable_on.rb
ActsAsTaggableOn::Tag.class_eval do
  has_friendly_id :name,
                  :use_slug => true,
                  :approximate_ascii => true,
                  :reserved_words => ['show', 'edit', 'create', 'update', 'destroy']
end

その後:

@user = User.new :name => "Jamie Forrest"
@user.tag_list = "This is awesome!, I'm a ruby programmer"
@user.save

そしてvoilá:

ActsAsTaggableOn::Tag.find('this-is-awesome')    #=> #<Tag id: 1, name: "This is awesome!">
ActsAsTaggableOn::Tag.find('im-a-ruby-programmer')    #=> #<Tag id: 2, name: "I'm a ruby programmer">

この助けを願っています...

于 2011-05-13T10:01:44.297 に答える
14

@vitorkのコードは良いスタートですが、friendly_idとacts_as_taggableの新しいバージョンでは機能しません。更新された初期化子は次のとおりです。

ActsAsTaggableOn::Tag.class_eval do
extend FriendlyId
friendly_id :name,
              :use => :slugged,
              :slug_column => :permalink,
              :reserved_words => ['show', 'edit', 'create', 'update', 'destroy']
end

私のdb列はpermalinkと呼ばれ、必要に応じてsluggedを使用できます。ところで、私は以下を使用しています:

  • friendly_id(4.0.5)
  • タグ付け可能として機能(2.2.2)

最初のコードをありがとうVitork!

于 2012-05-14T16:33:33.797 に答える
10

これを最新バージョン(Rails 4.x、friendly_id 5.x)で機能させるには、以下の手順に従う必要があります。

タグテーブルにスラッグを追加するための移行を作成する

# rails generate migration add_slugs_to_tags
class AddSlugToTags < ActiveRecord::Migration
  def change
    add_column :tags, :slug, :string
    add_index :tags, :slug
  end
end

:slug列の名前を変更できます。変更する場合は、初期化子で列名を指定する必要があります。移行を実行することを忘れないでくださいrake db:migrate

ActsAsTaggableOnの初期化子を作成します

# config/initializers/acts_as_taggable_on.rb
ActsAsTaggableOn::Tag.class_eval do
  extend FriendlyId

  friendly_id :name, use: :slugged
end

タグを検索するときは、Friendly_idに使用ActsAsTaggableOn::Tag.friendly.find 'tag-name'または追加:findersする必要があります。呼び出しを使用して、モデルで直接検索を使用します。詳細については、friendly_idガイドをご覧ください。

于 2014-04-13T08:21:35.973 に答える
9

実際、答えははるかに単純であり、friendly_idやその他の不要な拡張子を使用する必要はありません。

сonfig/initializers/ act_as_taggable_on.rb

ActsAsTaggableOn::Tag.class_eval do
  before_save { |tag| tag.slug = name.parameterize if name_changed? }

  def to_param
    slug
  end
end

必要に応じてスラッグ列を追加します。それ以外の場合は、before_saveコールバックをスキップします。

次に、ビューで、次のように繰り返す代わりに

article.tag_list.each do |tag|..

このように繰り返します

article.tags.each

tag_listは文字列のみを提供しますが、タグを使用するとuには実際のタグインスタンスがあります。そして少なくともコントローラーでは

if params[:tag]
   tag = ActsAsTaggableOn::Tag.find_by_slug(params[:tag])
   @articles = Article.moderated.includes(:user).tagged_with(tag)
end
于 2012-10-19T11:32:38.720 に答える
2

別の方法があります。

シングルアクションでタグのコントローラーを作成します。

rails g controller tags index

ルート.rbで、生成されたルートを次のように変更します

get 'tags/:tag' => 'tags#index', as: :tag

tags_controller.rbに次のコードを追加します。

def index
    @tag = params[:tag]
    @entries = Entry.tagged_with(@tag)
end

ここEntryで、はモデル名です。

これで、 example.com / tags/animalsのような素敵なURLですべてのエントリを取得できるようになりました


ビューでの使用法:

- @entry.tags.each do |tag|
  = link_to tag, tag_path(tag.name)
于 2016-11-10T14:25:46.363 に答える