2011-04-07 2 views
0

Rails 2.3.8 및 friendly_id 사용.username이 포함 된 사용자 URL을 구성하지만 모델 연관이 없음

사람 모델 :

class Person < ActiveRecord::Base 
    # Nice URL's in Rails. 
    def to_param 
    "#{login.downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-') 
    end 
end 

사람들 컨트롤러 (제거)

class PeopleController < ApplicationController 
    def show 
    @person = User.find(params[:id]) 

    if current_user == @person 
     @shops = @person.shops.paginate(:page => params[:page], :order => order) 
    else 
     @shops = @person.shops.by_status('published').paginate(:page => params[:page], :order => order) 
    end 

    end 

end 

사용자 모델 :

class User < ActiveRecord::Base 
    extend ActiveSupport::Memoizable 
    acts_as_authentic do |c| 
    c.validate_email_field = false 
    c.validate_login_field = false 
    end 

    attr_accessible :login, :email, :password, :password_confirmation, :name, :location, :website, 
        :allow_follower, :allow_message, :allow_updates, :allow_newsletter, :avatar, :role, :remember_me 

    # Returns name or login if name is blank 
    def full_name 
    if self.name.blank? 
     login.strip 
    else 
     (self.name || '').strip 
    end 
    end 
    memoize :full_name 

    # Nice URL's in Rails. 
    def to_param 
    "#{login.downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-') 
    end 

end 

People.rbUser.rbto_param 정의가 작동하지 않습니다.

Users 아래의 모든 페이지는 사용자의 계정 설정 용이며 개인보기 용이므로 아무 것도 쓸 필요가 없습니다. 하지만 공중보기 용 사용자의 프로필로 표시 할 컨트롤러는 People입니다.

people URL은 현재 나는 그것을에서 스핑크스 검색을 수행해야하기 때문에 people의 컨트롤러에 @person = User.find(params[:id])을 파괴하지 않고 아직 http://abc.com/people/login-name-here으로 설정하려면, http://abc.com/people/1입니다.

달성하려면 어떻게해야합니까? 고맙습니다.

답변

0

당신이 이미 이것을 해결했다면 다른 누군가가 여기에 오는데 도움이 될 것입니다.

friendly_id를 사용하는 경우 User.find(params[:id])을 깨뜨리지 않아야합니다. 사실 person/login-nameperson/123 경로가 모두 작동합니다.

레일 2.3.8을 사용하고 있으므로 friendly_id 버전 3.2.1.1을 사용해야합니다. activerecord 2.3.x - (여기에서 찾을 수 있습니다. https://rubygems.org/gems/friendly_id/versions/3.2.1.1)를 지원하는 최신 버전입니다. 버전 4.x에서는 activerecord 3 이상이 필요하므로 호환되지 않습니다.

  • 첫째, 등등 ... 사용자 테이블에 (필요한 경우 추가 지원이 제공 될 수 있습니다)

가 나는를 추가하는 것이 좋습니다 발전기를 실행합니다 (아직 공급하지 않은 경우) 보석을 설치 그 다음,

다음 (문자열로) ...

는 그냥 app/models/user.rb

에 다음을 추가 cached_slug

그리고 모델에서 to_param 메소드를 제거 할 수 있어야합니다. 문제가 발생하지 않도록 attr_accessible을 업데이트해야합니다.

has_friendly_id :stripped_login, :use_slug => true, :cache_column => 'cached_slug' 

가 그럼 그냥 추가 :

또한, friendly_id 사용하기 위해 문자열을 반환 인스턴스 메서드, 예를 생성 할 수 있습니다

def stripped_login 
    login.gsub(/regexhere/) 
end 

FriendlyId 당신을 위해 총알을 downcases.

참고 : attr_accessible 항목 앞에 has_friendly_id를 포함하는 데 문제가 있음을 기억합니다. 나는 그 라인 뒤에 배치 될 필요가 거의 확실하지만, 나는 그 순간 기억하지 못하는 것 같다.