Ruby on rails 友好Id和保留字--如何替换保留字?

Ruby on rails 友好Id和保留字--如何替换保留字?,ruby-on-rails,ruby,validation,friendly-id,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) SE

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

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模型中加入一些东西,可能用“-”或类似的词替换一个新词,但我不确定从哪里开始


谢谢大家!

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

7个RESTFul关键字被友好的as-slug选项阻止。这里的罪犯是新的

从您的代码来看,似乎您正试图将slug设置为“new”,因为它是您文章的标题

为了防止保留字被使用,可以使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
class Post:slugged#Used slugged模式,需要一个db中的slug列。
def名称和id
“#{id}-#{name}”
结束
结束
从这个示例代码中,当创建名为
my post
的帖子时,转到
localhost:3000/posts/1-my-post
会起作用。
-
分隔符是自动添加的,可以更改


有关更多详细信息,请参阅

我就是这样处理事情的。。我真的不确定这是对还是错。。。但我现在正在使用它。我真的很想听听其他的建议

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

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
我的模型看起来像这样:

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
classmymodel:sluged
def niceified_名称
niceify_slug(self.name)
结束
结束

使用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
class页面
我发布了我的解决方案。。。您的解决方案要简单得多。它们都有效=)。但是,如果你有一个保留的单词,你必须维护它们,每一个新版本的FriendlyID可能会添加/删除单词。在name后面附加Id将使slug始终是唯一的(但愿如此)。friendly中的保留词有助于确保你不会使用动作词。谢谢你的帖子!这可能需要更多的思考,友好的id在验证之前使用
,因此在生成slug时id不可用。如果您想这样做,您可以通过观察者执行“双重保存”来更新ID,或者干脆避免在自定义slug方法中使用ID。当我使用友好ID时,ID名称的附加在新记录上起作用。希望FriendlyID不会“猜测”新ID是什么。我会再调查的。谢谢我想补充一点,在我的例子中,使用会变成slug的单词,比如“Admin”,就是造成这种情况的原因。当我播种我的db时,我将我的用户名设置为除Admin之外的其他内容,这样slug就不会与保留字冲突。我希望这有帮助!