FriendlyId建议

时间:2013-05-15 00:43:34

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

我想使用FriendlyId实现此localhost3000/users/edu/profile,但我不知道该怎么做! 我有这些模型User和UserProfile

class User < ActiveRecord::Base
  has_one :user_profile, :dependent => :destroy
  extend FriendlyId
  friendly_id :name, :use => :slugged
end  

class UserProfile < ActiveRecord::Base
  attr_accessible :user_id, :name, :surname, :nickname
  belongs_to :user 
end

如何在用户的name中加载UserProfile的name?和 当UserProfile的名称发生变化时,如何更新用户名?

我使用的第一个

class User < ActiveRecord::Base
...

  def name
    if user_profile
      "#{user_profile.name}"
    end  
  end

但是当我在UserProfile中更新或创建新的配置文件时,我无法进行更改。

使用Ruby 1.9.3和Rails 3.2.13。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你的问题是关于在模型之间共享数据,而不是关于FriendlyId。

看来delegate是你最好的选择。它是ActiveSupport中的一种方法,它允许一个模型将另一个模型的方法公开为它们自己的方法。

class User < ActiveRecord::Base
  delegate :name, :name=, :to => :user_profile
end

参考:http://api.rubyonrails.org/classes/Module.html#method-i-delegate

委托:name:name=的原因是前一种方法允许您从该属性读取(getter),而后者允许您写入它(setter)。

在进行这些更改之前,您需要运行迁移以从数据库中的name表中删除users字段,因为从现在开始,您将使用其他数据模型。

rails g migration remove_name_from_users name:string