我要做的是以下内容:
任何时候用户都可以拥有1个有效个人资料。此活动配置文件必须由管理员授权,以确保其符合站点的规则和规定。当用户编辑其个人资料时,他们的公开个人资料不会受到影响,直到管理员注销其更改为止。如果他们在审核他们的个人资料时进行编辑,他们的编辑将应用于未完成的个人资料以供审核,并被推送到队列的后面。
我的模型看起来像这样:
class Profile < AR:B
belongs_to :user
end
class User < AR:B
has_many :profiles do
def active
...
end
def latest
end
end
def profile
self.profiles.active
end
end
有一个小问题......用户不应该直接编辑配置文件,因为配置文件集合未公开。相反,他们会编辑他们的用户,并在那里显示个人资料字段。
管理此问题的最佳方法是什么?目前我正在使用:
accepts_nested_attributes_for :profiles
在用户中,但这似乎相当hacky。理想情况下,大部分逻辑都存在于模型中,但我正在调情的另一件事是使用演示者。
我们将非常感谢您的任何想法,如果您需要更多信息作为评论,请告诉我,我会适当地更新这篇文章。
答案 0 :(得分:2)
也许你应该尝试从用户到个人资料的两个关系。一个是他们可以通过用户界面编辑的,另一个是管理员批准的。
它可以起作用:
class User < AB:B
has_one :profile #the user-editable one one
has_one :active_profile, :class_name=>"profile" #the one shown
end
然后,通过表单对用户个人资料的每个更改都会显示给管理员(使用和观察者或者只是和“after_save”过滤器)。当它批准它时,然后将更改转储到active_profile,并在某处显示。
这样,您就可以拥有一个干净的表单界面,每当他们再次编辑它时,他们就会看到最新的(但未经批准的)个人资料。您还可以使用updated_at列对队列进行排序,以获得“他们的编辑应用于未完成的配置文件以供审阅,并被推送到队列的后面”功能。
答案 1 :(得分:1)
我会通过让用户Model与上面建议的两个配置文件建立关系来解决这个问题。一个“已批准”配置文件,以及用于编辑的配置文件进入管理队列。
但是,为了处理“待处理”配置文件和“已批准”配置文件之间的转换,我建议可以添加状态机来处理转换。在最近的一个项目中,AASM宝石对我很有好处。 (http://github.com/rubyist/aasm/tree/master),我相信Edge Rails也刚刚出现了State Machinage。 (http://github.com/rails/rails/commit/aad5a30bf25d8a3167afd685fc91c99f4f09cc57)
您的模型可能如下所示:
class User < AR:B
has_one :active_profile
has_one :pending_profile
include ActiveRecord:: StateMachine
state_machine do
state :approved
state :pending
state :rejected
event :update_profile_pending do
transitions :to => :pending, :from => [:approved], :on_transition => :send_to_admin_queue
end
event :update_profile_approved do
transitions :to => :approved, :from => [:pending], :on_transition => :update_current_profile
end
event :update_to_rejected do
transitions :to => :rejected, :from => [:pending]
end
end
def send_to_admin_queue
//method to handlesending pending profiles to admin for approval
end
def update_current_profile
//method to handle updated profiles with changes
end
end
然后您可以调用User.update配置文件暂挂!或者User.update个人资料获得批准!在您的个人资料状态之间切换,并使用转换回调来处理在您的有效个人资料和待处理个人资料之间发送编辑数据。
至于将nested_attributes_for与你的实际表单一起使用,我不认为它是一个hack,我也使用它来更新嵌套属性,它工作正常。在这种情况下,您可能不需要,因为您有2个配置文件(一个公开,一个待处理)。
只是一个想法!在这里大声思考!