2012-08-24 61 views
0

我有一个使用脚手架生成器创建的ProTip模型。除indexshow之外的所有操作都要求您成为管理员。如何从两个不同的控制器创建模型

我想允许用户提交自己的ProTip s,但将其存储在队列中,直到有人有机会批准它们。

我能想到的几种方法可以做到这一点:

  1. 创建具有相同的字段ProTip一个UserSubmittedProTip一个完全不同的模式。使用index,newcreate动作创建一个新的UserSubmittedProTipController。在create操作中,我可以创建一个新的ProTip,并在保存到数据库之前将UserSubmittedProTip中的属性复制到它。我可以要求管理员执行index操作,并可以使用它来执行审批。

  2. 创建一个新的SubmitController只有newcreate的操作。创建一个视图,该视图共享部分ProTip_form,但知道要提交哪个控制器。在create操作中,我可以在保存之前将ProTip.approved设置为false。那么我将不得不建立一个审批机制。

第一种方法似乎是最简单的,因为我不知道如何实现第二种方法。两种方法都觉得有点笨拙,我想知道这种问题的最佳做法是什么。

这是解决这个问题的唯一方法吗? 如果没有,更聪明的是什么?否则,这更接近最佳实践,还是他们明显错误?

回答

1

我不会推荐第一个解决方案。

在您的情况下,如果您不想真正使用两个控制器,则没有任何理由。

如果当前用户是管理员,则可以简单地创建对象。

如果当前用户不是管理员,则创建该对象,但设置该项目需要审批的布尔值,或者执行相反操作....在您是管理员时设置“已批准”标志。

当管理员查看列表操作时,可以显示额外的“批准”列。

def create 
    @protip = Protip.new(params[:protip] 
    # I'm assuming you have logic to determine if the user is an admin. 
    # I usually encapsulate that in a method on the user model. So 
    # my code would look like this: 
    @protip.approved = true if current_user.is_an_admin 
    if @protip.save 
    ... do your normal stuff 


end 

确保您有一个范围的批准protips

scope :approved, where(:approved => true) 

而且总是显示那些。

@protips = Protip.approved 

如果你确实想保持它们分开,你当然可以重复使用partials。当您进行渲染调用时,您可以指定从哪里获取部分。

render "/protips/_form" 

这是怎么开始的?

+0

完美。感谢您的详细回复。有时候,我需要退后一步,意识到有一种更简单的方法,因为通常情况下是这样。 –

相关问题