2011-09-23 3 views
1

Ruby On Rails로 만든 웹 응용 프로그램이 있습니다. 지금은 객체를 표시하려고 할 때 다음 페이지에 액세스해야합니다. http://mywebapp.com/object/1234 1234 객체의 ID.url (레일의 루비)에서 ID를 어떻게 가리는 지

해당 개체 ID를 인코딩하고 다음 결과를 얻고 싶습니다. (예일뿐입니다).

어떻게 할 수 있습니까?

많은 감사,
마틴

+0

:

class MyObjectController def some_action my_object = MyObject.find_by_slug(params[:slug]) ... end end 

가 routes.rb을 수정 잊지 마세요! 가역적 인 인코딩 스키마로 어떤 방식으로 객체의 ID를 가리고 싶다는 뜻입니까? – brad

+0

@brad - 예 정확히 – MartinMoizard

+0

@nurinur - 가장 오래된 질문의 사본으로 태그 붙여야 할 가장 오래된 질문입니까? 그건 말도 안돼. – MartinMoizard

답변

5

이러한 변환 방법은 모두 되돌릴 수 있으므로 개체에 어떤 이름이나 제목이 있거나 무엇이든간에 가장 좋은 방법은 슬러그를 추가하는 것입니다. 행동에 당신이 찾을 수 있기 때문에,

class MyObject 

    validates_format_of :slug, :with => /\A[a-z\-0-9]*\Z/ 
    before_validation :generate_slug, :on => :create  

    def generate_slug 
    if self.slug.blank? 
     slug = self.name.mb_chars.downcase.normalize(:kd).to_s.gsub(/-/, " ").squeeze(" ") 
     slug = slug.gsub(/\s/, "-").gsub(/[^a-z\-0-9]/, "") 

     current = 1 
     self.slug = slug 
     while true 
     conflicts = MyObject.where("slug = ?", self.slug).count 
     if conflicts != 0 
      self.slug = "#{slug}-#{current}" 
      current += 1 
     else 
      break 
     end 
     end 
    end 
    end 
end 

은 다음 URL이 http://mywebapp.com/object/my_object_slug 될 수 있습니다 개체에 슬러그를하자 자동으로 개체 이름 (또는 뭔가 다른) 모델부터 값의 생성 : 이러한 경우에 새로운 속성을 추가 이 슬러그를 통해 객체 : URL을 길게

match "object/:slug", :to => "my_objects#some_action" 
+0

감사! 몇 분 후에 그걸 시험해보고 알려 드리겠습니다. – MartinMoizard

+1

또한, 모델의': to_param' 메소드를 오버라이드하여 슬러그 값을 반환함으로써 리소스가 충분한 경로를 계속 사용할 수 있습니다. 그렇다면 레일즈는 "ID"대신에 그것을 사용할 것이지만 여전히'params' 해시에': id'를 전달할 것입니다. – Romain

+0

https : // github.com/norman/friendly_id – lloydpick

1
당신이 정말로 아마 당신이 결정을 쉽게 Base64 인코딩을 사용하고 추측 할 수있는 내부 ID 비밀 누군가를 유지하려고하는 경우하지만 당신은 아마 (Base64 인코딩이 할 수

신분증).

컨트롤러가 조금 같이해야이

class ThingsController < ApplicationController 
    require 'base64' 

    def show 
    @thing = Thing.find Base64.urlsafe_decode64(params[:id]) 
    end 

    def edit 
    @thing = Thing.find Base64.urlsafe_decode64(params[:id]) 
    end 

    #These are just a couple of very simple example actions 

end 

이제 실제로 약간 난이도가 될 것입니다 URL을 인코딩 - (이 흥미로운 문제처럼 보인다 나는 그것으로 볼 것이다하지만, 나는 어떤 약속도하지 않고있다.)

  • 편집 -

독서의 비트가 ActionView 개체의 ID를 얻기 위해 url_for의 to_param 방법을 사용하는 것을 알 수있다. 우리는 이것을 모델 자체에서 오버라이드하여 ID를 인코딩 할 수 있습니다.

class Thing < ActiveRecord::Base 

    def to_param 
    Base64.urlsafe_encode64 self.id.to_s 
    end 

end 

여기에 작성한 모든 내용은 추측입니다. 이전에이 작업을 수행하지 않았거나 코드를 테스트 했으므로 작동 여부 또는 예기치 않은 문제가 있는지 여부를 보증 할 수 없습니다. 나는 당신이 어떻게 가는지 듣는 것에 매우 흥미가있을 것입니다.

+0

brad 감사합니다. 보기에 특별한 것이 있습니까? – MartinMoizard

관련 문제