如何将example.com/profiles/1移动到带有friendly_id的example.com/username和用户模型的用户名?

时间:2011-10-11 11:14:26

标签: ruby-on-rails profile friendly-id

我有关于rails的friendly_id的红色文档。这很简单:你将某个属性设置为slug。

example.com/username

User has_one profile
Profile belongs_to User

所以你看到了我的困境。我在配置文件模型中没有列用户名。如何链接用户模型,用户名字段以便我可以使用friendly_id进行example.com/username?

当然这相对简单。

3 个答案:

答案 0 :(得分:2)

您可以在路线文件的末尾使用“全部捕获”路线:

map.connect ':username', :controller => 'profiles', :action => 'show' (this is for Rails 2.3)

在配置文件控制器中,方法显示您是否有用户具有该用户名,以及是否属于当前配置文件

def show
  if User.find_by_username(params[:username])
    if @current_user == User.find_by_username(params[:username])  
     # @profile = @current_user.profile
     # render projects#show view 
    else
     # flash error message, because the current user tries to access other users profile (in case your app doesn't allow it)
  else
    # render page not found error 
  end
end

我对项目模型有类似的情况,来自projects / id => /项目名。 在您的情况下,它更容易一些,因为在数据库中您有唯一的用户名。 啊,并没有涉及额外的宝石。

答案 1 :(得分:1)

ProfilesController#show

def show
  @user = User.joins(:profile).where("profiles.username = ?", params[:username])
end

路线:

match ':username' => "profiles#show'

或者,您可以向User模型添加方法以使控制器更清洁:

class User < ActiveRecord::Base
  def fetch_by_username(username)
    joins(:profile).where("profiles.username = ?", username)
  end
end

在你的控制器中:

@user = User.fetch_by_username(params[:username])

答案 2 :(得分:1)

您可以使用自定义方法生成所需的slu ..

class Profile < ActiveRecord::Base
  has_many :users

  has_friendly_id :custom_url_method, :use => :slugged

  def custom_url_method
     self.user.username.to_url
  end

to_url来自Stringex gem。您也可以使用Friendly_id本身提供的Babosa帮助方法之一。