2013-12-09 3 views
3

레일즈 젬 "friendly_id"를 사용하여 슬러그의 "라이브 미리보기"를 만들 수 있습니까? 객체가 저장되기 전에, (그리고 ajax 요청을 사용하여 타이핑하는 동안 리턴 될 것입니다)?Rails gem "friendly_id": 객체가 생성되기 전에 슬러그의 실시간 미리보기를 얻는 방법

그렇다면 어떻게됩니까? 그냥 .slug처럼 https://github.com/norman/friendly_id/blob/master/test/slugged_test.rb

+0

위원회는 당신이 소스를 읽었는지, 자동 테스트를 보았는지,'.save()'콜백 등으로 디버깅을했는지 물어야한다. – Phlip

+0

피고인의 지식은 배심원이 요구하는만큼 고급 일 수는 없지만 탄원 : 무죄. – TomDogg

답변

9

FriendyId 작성자입니다.

FriendlyId는 내부적으로 개인 set_slug을 사용합니다. 이 메소드는 before_validation 콜백을 통해 호출됩니다. 어떤 이유로 당신이 valid?를 호출하지 않으려면 send를 통해 set_slug 메소드를 호출하거나 호출 모델의 방법을 정의 할 수 있습니다 : 그러나

instance = ModelClass.new 
instance.send(:set_slug) 

# or 
class ModelClass < ActiveRecord::Base 
    friendly_id :name, use: :slugged 

    def generate_slug_preview 
    set_slug 
    end 
end 

을 우회하거나 검증을 무시하는 것은 종종이므로주의 나쁜 생각. 예를 들어 모델에 name 필드에 유효성 검사가 포함 된 경우 해당 필드를 슬러그의 기초로 사용한 경우 실제로 생성되지 않는 슬러그를 미리 봅니다.

+3

FriendyId 작성자가 친절합니다! :) – TomDogg

1

...

m1 = model_class.new :name => "a b c d" 
    m1.valid? 
    assert_equal "a-b-c-d", m1.slug 

보인다. 다른 테스트에 따라 create - new을 수행 할 필요가 없습니다. 그래서 당신의 전략은 다음과 같습니다

  • 가 텍스트 필드
  • 에 사용자가 변경 때마다 onchange 처리기를 추가로 서버
  • new 모델의 인스턴스에 현재 값을 보내 Ajax를 사용 값 이름이든 세트는 아약스
  • 전화 slug를 전송하고, 웹 페이지
에서 웹 페이지로 돌아
  • 디스플레이를 결과를 보내

    모든 것은 표준 Ajax 항목이며, friendly_id과는 관계가 없습니다. 그러나 그것은 모두 나를 궁금하게 만든다 - 당신이 사용자에게 슬러그를 보여주기 때문에 - friendly_id은 당신에게 강타를 편집하게 할 것이고, 하이 엔드 블로그는 그렇게 할 것이다.

    그리고 먼저 valid?으로 전화해야합니다.

  • +0

    감사합니다. 불행히도,'''Article.new (제목 : "A new article")와 같은 것을 호출합니다. 슬러그는 반환하지 않습니다 ... – TomDogg

    +0

    당신의 솔루션은 정확합니다. 실패한 b/c 나는 슬러그의 생성에 필요한 속성에 대한 하나의 값만 전달했습니다.) 따라서, 모든 유효성 검사를 조건부로해야합니다. 즉,'''validates : name : : on_the_fly'''를 제외하고''''attr_accessor : on_the_fly''' 모델에 추가하고'''true''를 합산해야합니다. 사용자가 자신의 가치를 창출 할 때마다 가치를 부여합니다. (반면에, 이것은 누군가가 유효성 검사를 우회 할 수 있기 때문에 안전한 것처럼 보이지 않습니다.) – TomDogg

    +0

    Tx 그러나 그 해결책은 짜증납니다. 유효성 검사가 모델이 아닌 양식에 속하기 때문에 레일스 유효성 검사가 실패합니다. 예를 들어 다른 사용자가 다른 양식을 볼 때 다른 유효성 검사가 발생할 수 있습니다. 따라서 friendly_id에 .valid?슬러그를 생성하기 위해 전달하라. – Phlip