如何从两个不同的控制器创建模型

时间:2012-08-24 03:47:24

标签: ruby-on-rails-3

我使用脚手架生成器创建了ProTip模型。除indexshow之外的所有操作都要求您成为管理员。

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

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

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

  2. 创建仅SubmitControllernew次操作的新create。创建一个以某种方式共享ProTip _form部分但仍知道要提交给哪个控制器的视图。在create操作中,我可以在保存之前将ProTip.approved设置为false。然后我必须创建一个批准机制。

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

    这些是解决此问题的唯一两种方法吗? 如果没有,那会更聪明些什么?否则,哪个更接近最佳做法,还是他们都错了?

1 个答案:

答案 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"

一开始怎么样?