Friendly_Id和保留字 - 如何替换保留字?

时间:2011-11-05 03:02:40

标签: ruby-on-rails ruby validation friendly-id

以下是导致错误的原因示例:

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模型中添加一些可能用“ - ”替换一个新单词或者其他内容的东西,但我不知道从哪里开始。

谢谢!

3 个答案:

答案 0 :(得分:3)

使用 daemonsy SizzlePants 的答案,我想出了这个,它将“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

答案 1 :(得分:0)

我刚才注意到这是一个老问题。非常想知道你是如何解决这个问题的。

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

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

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

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即可。 -分隔符会自动添加,可以更改。

有关详细信息,请参阅Friendly Id Guide.rdoc

答案 2 :(得分: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