1

私は名前:文字列のアーティストモデルを持っています。そして、私が今持っている /users/1/artists/1/posts の代わりに /users/1/artists/jimi-hendrix/posts が欲しい

問題は、アーティスト名に Friendly_id を使用できないと思うことです。これは、同じアーティスト名が複数あるためですが、すべての「ジミ・ヘンドリックス」エントリに jimi-hendrix などの同じスラッグを使用したいためです。例:

  /users/3/artists/jimi-hendrix/posts
  /users/55/artists/jimi-hendrix/posts
  /users/106/artists/jimi-hendrix/posts

Friendly_id は次のようになります: (これは私にはありません) /users/3/artists/jimi-hendrix/posts /users/55/artists/jimi-hendrix--2/posts /users/106/artists/jimi -ヘンドリックス--3/posts

私が考えているのは、id の代わりにそのアーティスト名パラメーターをコントローラーに渡すことです。しかし、名前を取得してすべての空白を「-」に置き換えてから、空白をコントローラに追加し直す必要がありますか?

これが私のリンクになります: (artist.name.gsub!() のようなことはできますか??)

 <% @artists.each do |artist| %>
    <%= link_to artist.name, user_artist_posts_path(@user, artist.name) %> 
  <% end %>

次に、コードをコントローラーに戻すときに逆にしますか?

def index @name = params(:artist_id).gsub() # ? @posts = ... .... 終了

または、属性に重複した名前がある場合、--2、--3 を追加しないように、Friendly_id に一意でないスラッグを含める方法を誰かが知っていますか?

4

2 に答える 2

0

これには、スコープ付きの Friendly_id を使用できるはずです。

これは、 Friendly_id 3.x と 4.x の両方で使用できます。

例: Friendly_id 3.x でできること

has_friendly_id :name, :use_slug => true, :scope => :user

および 4.x では

extend FriendlyId
friendly_id :name, :use => :scoped, :scope => :user

user_id が 55 の場合、find ステートメントはUser.find(55).artists.find(params[:id])たとえば次のようになります。またはArtist.find(params[:id]).where(:user_id => 55)

あなたが持っているかもしれない他のコード(ルート/モデル/ has_many / belongs_to関係)を見なければ、正確な答えを出すことはできません.

FriendlyId 4.x ドキュメントhttp://rubydoc.info/github/norman/friendly_id/master/frames

FriendlyId 3.2.1.1 ガイドhttps://github.com/norman/friendly_id/blob/a9505acb68c56719d8225ccb09b5840e26be2783/Guide.md

于 2012-03-03T13:41:00.173 に答える
0

単語以外の文字を gsub するには:

@name = params[:artist_id].gsub( /\W/, '-' )
于 2011-07-30T03:59:33.703 に答える