我使用脚手架生成器创建了ProTip
模型。除index
和show
之外的所有操作都要求您成为管理员。
我希望允许用户提交自己的ProTip
,但将其存储在队列中,直到有人有机会批准它们为止。
我可以想到几种方法来做到这一点:
为UserSubmittedProTip
创建一个完全不同的模型,其字段与ProTip
相同。使用UserSubmittedProTipController
,index
和new
操作创建新的create
。在create
操作中,我可以创建一个新的ProTip
,并在保存到数据库之前将属性从UserSubmittedProTip
复制到它。我可以要求管理员执行index
操作,并可以使用它来执行审批。
创建仅SubmitController
和new
次操作的新create
。创建一个以某种方式共享ProTip
_form
部分但仍知道要提交给哪个控制器的视图。在create
操作中,我可以在保存之前将ProTip.approved
设置为false
。然后我必须创建一个批准机制。
第一种方法似乎最简单,因为我不知道如何实现第二种方法。这两种方法都有点笨拙,我想知道这类问题的最佳做法是什么。
这些是解决此问题的唯一两种方法吗? 如果没有,那会更聪明些什么?否则,哪个更接近最佳做法,还是他们都错了?
答案 0 :(得分: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
确保您拥有已批准的原型的范围
scope :approved, where(:approved => true)
总是展示那些。
@protips = Protip.approved
如果您确实希望将它们分开,那么您当然可以重复使用部分内容。当您进行渲染调用时,您可以指定从哪里获取部分。
render "/protips/_form"
一开始怎么样?