5

这是导致错误的原因的示例:

ruby-1.9.2-p290 :004 > Post.new(title: "new").save!
   (0.3ms)  BEGIN
  post Load (0.3ms)  SELECT `posts`.* FROM `posts` WHERE (`slug` = 'new' OR `slug` LIKE 'new--%') ORDER BY LENGTH(`slug`) DESC, `slug` DESC LIMIT 1
   (0.3ms)  SELECT 1 FROM `posts` WHERE `posts`.`lsi_post_id` = BINARY '' LIMIT 1
   (0.1ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Friendly is reserved

我想在 Post 模型中添加一些东西,可能用“-”或类似的东西替换一个新词,但我不知道从哪里开始。

谢谢!

4

3 回答 3

3

使用daemonsySizzlePants的答案我想出了这个,它悄悄地将“new”重命名为“new2”,将“edit”重命名为“edit2”,并保持其他所有内容:

class Page < ActiveRecord::Base

  extend FriendlyId
  friendly_id :friendly_id_title, use: :slugged
  def friendly_id_title
    case title.parameterize
    when 'new' then 'new2'
    when 'edit' then 'edit2'
    else title
    end
  end

end
于 2012-04-06T22:40:58.893 回答
0

我刚刚注意到这是一个老问题。也很想知道你是怎么解决这个问题的。

7 个 RESTFul 关键字被 Friendly 作为 slug 选择阻止。这里的罪犯是new

从您的代码中,您似乎正在尝试将 slug 设置为“新”,因为它是您帖子的标题。

为了防止使用保留字,您可以使 slug 生成器使用方法而不是列。

class Post < ActiveRecord::Base
  extend FriendlyId 

  friendly_id :name_and_id, :use=>:slugged # Used slugged mode, need a slug column in db.

  def name_and_id
    "#{id}-#{name}"
  end

end

从这个示例代码中,当创建一个名为 的帖子时my post,可以localhost:3000/posts/1-my-post正常工作。分隔符是自动添加的-,可以更改。

有关详细信息,请参阅友好 ID Guide.rdoc

于 2012-02-20T07:29:28.283 回答
0

这就是我解决问题的方式..我真的不确定它是对还是错......但我现在正在使用它。真的很想听听其他建议。

我的应用程序助手看起来像这样:

module ApplicationHelper
  # Friendly_Id reserved words
  def niceify_slug(s)
    clean_slug = s
    reserved_words = ["new", "edit"]
    reserved_words.each { |word| clean_slug = clean_slug.gsub(/\b#{word}\b/i, "#{word}_") }

    return clean_slug
  end
end

我的模型看起来像这样:

class MyModel < ActiveRecord::Base
  include ApplicationHelper

  # Slugs via FriendlyId
  extend FriendlyId
  friendly_id :niceified_name, :use => :slugged

  def niceified_name
    niceify_slug(self.name)
  end
end
于 2012-02-22T00:14:57.323 回答