2013-03-29 1 views
0

friendly_id이 올바르게 설정되어 있고 모든 것이 작동하며 슬러그를 사용합니다.FriendlyID가 HTML 이스케이프 처리 된 슬러그를 만들지 않습니다

내가 겪고있는 문제는 Tag 모델 (FriendlyId가 첨부 된 모델)의 일부 이름이 HTML 이스케이프 처리되어야한다는 것입니다.

c++ 또는 .net과 같은 이름. 내가 Tag.find_each(:&save) 실행하면

, 그것은 나를 위해 모든 굼벵이를 생성 .... 그러나 그 이름을 가진 해당 태그에,이 무슨 일이 있었는지입니다 :

> c = Tag.where(:name => "c++") 
    Tag Load (0.9ms) SELECT "tags".* FROM "tags" WHERE "tags"."name" = 'c++' 
=> [#<Tag id: 2, name: "c++", num_questions: 187598, created_at: "2013-03-23 07:02:09", updated_at: "2013-03-29 15:34:09", questions_count: 87, slug: "c">] 
> Tag.where(:name => ".net") 
    Tag Load (0.9ms) SELECT "tags".* FROM "tags" WHERE "tags"."name" = '.net' 
=> [#<Tag id: 142, name: ".net", num_questions: 149074, created_at: "2013-03-23 07:09:47", updated_at: "2013-03-29 15:34:10", questions_count: 85, slug: "net">] 
1.9.3p392 :012 > Tag.where(:name => "c#") 
    Tag Load (1.0ms) SELECT "tags".* FROM "tags" WHERE "tags"."name" = 'c#' 
=> [#<Tag id: 38, name: "c#", num_questions: 435620, created_at: "2013-03-23 07:03:27", updated_at: "2013-03-29 15:34:10", questions_count: 130, slug: "c--3">] 

주의 사람들의 각각의 굼벵이 - 방법 각 레코드의 name에 제대로 대응하지 않습니다.

어떻게 수정합니까?

답변

1

friendly_id (적어도 :use => :slugged으로 전화 할 때) URL에서 멋지게 보이도록 필드 값을 "정리"하려고합니다. 해당 동작을 변경하려면 normalize_friendly_id을 무시할 수 있습니다. 그렇게한다면 # 같은 것들은 이미 URL에 특별한 의미를 지니고 있기 때문에 슬러그를 URL 인코딩해야합니다.

이 문제를 해결할 수있는 방법은 friendly_id의 :use_slugged을 사용하는 대신 태그의 원시 이름을 사용하고 Rails의 링크 헬퍼가 자동으로 이스케이프하도록하는 것입니다. ".net"태그의 경우 Rails가 도트를 경로 구분 기호로 해석하지 않게하려면 경로를 resources :tags, :constraints => { :id => /.*/ }으로 변경해야했습니다.

+0

수호 .... 그런 복잡함을 느끼지 않고 ... 원하는 단순한 이름을 어떻게 허용합니까? – marcamillion

+0

URL에 굼벵이가 나타나야한다고 가정합니까? 그렇다면 어떻게 이러한 "문제 캐릭터"를 처리하기를 원하십니까? 특히'# '기호의 경우,이를 대체하거나 URL 인코딩해야합니다. –

+0

정확하게 지적했듯이,'normalize_friendly_id'는 문자열에서'parameterize'를 호출합니다 - https://github.com/norman/friendly_id/blob/master/lib/friendly_id/slugged.rb#L244 내가 원하는 것 그렇게하려면이 문자열을 작동시키는 것입니다. 필자의 레일즈 콘솔에서'C# .parameterize'를 실행하면'> "C#"가됩니다. 파라미터 화 => "c"'내가 원하지 않는 것은 정확히 무엇입니까. – marcamillion