0

我有一个ProTip使用脚手架生成器创建的模型。index除并show要求您成为管理员之外的所有操作。

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

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

  1. UserSubmittedProTip为具有与 相同字段的 a 创建一个完全不同的模型ProTipUserSubmittedProTipController使用和操作创建一个新index的。在操作中,我可以创建一个新的并将属性从它复制到它,然后再保存到数据库。我可以要求管理员执行该操作,并可以使用它来执行批准。newcreatecreateProTipUserSubmittedProTipindex

  2. SubmitController仅使用newcreate操作创建一个新的。创建一个以某种方式共享ProTip's _formpartial 但知道要提交到哪个控制器的视图。在create操作上,我可以在保存之前将其设置ProTip.approvedfalse。然后我必须创建一个批准机制。

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

难道只有这两种方法可以解决这个问题吗?如果没有,什么会更聪明?否则,哪个更接近最佳实践,还是它们都明显错误?

4

1 回答 1

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"

开头怎么样?

于 2012-08-24T17:01:59.487 回答