2011-11-05 67 views
4

這裏是什麼原因導致的錯誤示例: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模型,也許替換爲新詞「 - 」或類似的規定,但我不知道從哪兒開始。

謝謝!

回答

0

我剛剛注意到這是一個老問題。非常想知道你是如何解決這個問題的。

7個RESTFul關鍵字被友好人士視爲阻塞選項。這裏的罪犯是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作品文章時。 -分隔符會自動添加並可以更改。

有關更多詳細信息,請參見Friendly Id Guide.rdoc

+0

我發佈了我的解決方案...您的解決方案要簡單得多。 –

+0

他們都工作=)。但也許如果你有一個reserved_words,你必須維護它們,每個新的FriendlyID版本都可能會添加/刪除單詞。將Id附加到名稱上會使slu always始終是唯一的(手指交叉)。友好的保留字有助於確保您不會使用動作詞。感謝帖子! –

+1

這可能需要多一點思考,friendly_id使用'before'驗證,所以ID在生成slug時不可用。如果你想這樣做,你可以通過觀察者進行'雙保存'來更新ID或者簡單地避免在自定義slug方法中使用ID。 –

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 

我的模型看起來是這樣的:由daemonsySizzlePants

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 
2

使用的答案我想出了這個,它悄悄地將「新」改名爲「新2」,「編輯」改爲「編輯2」,並保持與以前一樣:

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 
+0

非常可讀,謝謝你添加你的解決方案。 –