2011-04-07 12 views
0

使用Rails 2.3.8和friendly_id的关联。在它的用户名配置用户的网址,但没有模型

人模式:

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目前http://abc.com/people/1,我希望把它转化为http://abc.com/people/login-name-here,但没有打破@person = User.find(params[:id])people的控制器,因为我需要在它执行狮身人面像搜索。

我能做些什么来实现呢?谢谢。

回答

0

希望这会帮助别人来这里,如果你已经解决了这个。

它不应该打破User.find(params[:id]),如果使用friendly_id ..其实person/login-nameperson/123两个工作路线。

由于您使用rails 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+,因此不兼容。

  • 首先,安装gem(如果尚未完成),运行发电机等...(如果需要,可提供更多这方面的帮助)

在user表我建议您加入列(作为一个字符串)

然后,紧接着...

只需添加以下app/models/user.rb

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

,你应该能够摆脱你的模型to_param方法。 请记住更新attr_accessible以避免问题。

此外,您还可以创建一个返回一个字符串与friendly_id使用实例方法,如:

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

然后只需添加:

def stripped_login 
    login.gsub(/regexhere/) 
end 

FriendlyId downcases蛞蝓你。

注意:我记得在attr_accessible项目之前包含has_friendly_id存在问题。我几乎可以肯定它需要放在那条线之后,但目前我似乎还没有回忆。

相关问题