2011-11-05 1 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 

나는 어쩌면 새로운 단어로 대체 포스트 모델에 뭔가를 넣어 싶습니다 "-"그 라인을 따라 또는 뭔가를하지만 난 잘 모르겠어요 어디서 시작하나요.

감사합니다.

답변

0

나는 이것이 이전 질문이라는 것을 알게되었습니다. 어떻게 문제를 해결했는지 알고 싶습니다.

7 개의 RESTFul 키워드는 슬러그 선택에 따라 우호적으로 차단됩니다. 여기있는 범인은 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 

, localhost:3000/posts/1-my-post 작품에가는 이름 my post와 게시물을 만들 때. - 구분 기호가 자동으로 추가되며 변경할 수 있습니다.

자세한 내용은 Friendly Id Guide.rdoc을 참조하십시오.

+0

내 솔루션 게시 ... 솔루션이 훨씬 간단합니다. –

+0

둘 다 =). 그러나 아마도 reserved_words가있는 경우 유지해야합니다. FriendlyID의 새 버전은 단어를 추가/제거 할 수 있습니다. 이름에 ID를 추가하면 슬러그가 항상 고유하게 나타납니다 (손가락이 엇갈리게됩니다). 친근감있는 예약어는 행동 단어를 사용하지 않도록하는 데 좋습니다. 게시물을 가져 주셔서 감사합니다! –

+1

이것은 조금 더 생각할 필요가 있습니다. friendly_id는'before' 유효성 검사를 사용하므로 슬러그가 생성 될 때 ID를 사용할 수 없습니다. 이렇게하려면 관찰자를 통해 ID를 업데이트하거나 단순히 사용자 정의 슬러그 메소드에서 ID를 사용하지 않는 방법으로 '이중 저장'을 수행 할 수 있습니다. –

0

이것은 내가 물건을 가지고있는 방법입니다. 나는 그것이 옳은지, 틀린 지 나는 정말로 확신하지 못합니다.하지만 저는 그것을 지금 사용하고 있습니다. 정말 다른 제안을 듣고 싶습니다. 나는이 함께했다 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

답변을 사용 :

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 

내 모델은 다음과 같은 :

내 응용 프로그램 도우미는 다음과 같이 보입니다 "new2"와 "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 
+0

매우 읽기 쉽습니다. 솔루션을 추가해 주셔서 감사합니다. –