Rails - 在一个控制器中创建多个模型

时间:2014-06-18 17:01:09

标签: ruby-on-rails model-view-controller ruby-on-rails-4

这更像是设计然后是技术问题.. 我对Rails很陌生,并试图遵循它的指导原则:

我有一个名为" Foo"以及" FooController"和#34; UserForm.html.erb"创建新的Foo对象,重定向到FooController#create ..
当用户填写表单中的文本字段并提交它时,"创建"在FooController类中调用action,其中Foo模型持久保存到DB。

这一切都非常简单,直到我添加了一个名为" Bar":
的新模型 酒吧模型与" Foo"没有任何共同之处。除了提交它们的形式(" UserForm.html.erb")现在还有一些逻辑,如果用户输入一个特殊的字符串,如" Create Bar!"然后应该创建并保留一个Bar实例 一开始我考虑创建一个新的BarController并使用BarController#create方法从FooController#create重定向到redirect_to,如果输入字符串是正确的,但这看起来很难看......

这样的事情:

class FooController < ApplicationController
   def create
      if(params[:user_input] != "CreateBar!"
         redirect_to bar_create_path
      else
         Foo.create()
   end
end

所以现在我正在考虑在FooController#create动作中创建Bar对象,但是有一个控制器负责单个模型来创建其他一些控制器仍然有点奇怪模型只是因为它们都受到视图的约束:

class FooController < ApplicationController
   def create
      if(params[:user_input] != "CreateBar!"
         Bar.create()
      else
         Foo.create()
   end
end

我想两种方式都可以,但是正确的轨道方式是什么?也许还有第三种方式我没想过?

1 个答案:

答案 0 :(得分:1)

您不需要控制器来创建模型。您可以在同一个控制器中创建两个模型,它们将起作用。

作为一个例子,请阅读:

Multiple Forms on one Ruby page using Rails 4

其中有类似的问题:

def update foo_bar
  if params[:bar]
    @foo = Bar.new(strong_foo_params)
    if @bar.save
       #whatever
    else
       #errors
    end
  else
    #actions for bar
  end
end

注意:

如果您要同时创建两个条目,则必须将其包装在某个事务上,或者考虑到可以保存一个模型而其他模型可以保存。

另一种选择是在保存之前要求.valid。