1

我有一个艺术家模型是名称:字符串。我想要 /users/1/artists/jimi-hendrix/posts 而不是我现在拥有的 /users/1/artists/1/posts

问题是我不认为我可以使用friendly_id 作为艺术家的名字,这是因为我有多个相同的艺术家名字,但我想使用相同的slug,例如所有'jimi hendrix'条目的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 -hendrix--3/帖子

所以我想做的是将艺术家姓名参数传递给控制器​​而不是 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 = ... ...结束

或者有人知道如何在friendly_id 中添加非唯一的slug,因此如果属性具有重复名称,它不会附加--2、--3?

4

2 回答 2

0

要 gsub 任何非单词字符:

@name = params[:artist_id].gsub( /\W/, '-' )
于 2011-07-30T03:59:33.703 回答
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 回答