我想使用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。
答案 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