如何在rails中初始化或显示嵌套表单?

时间:2014-07-25 04:43:09

标签: ruby-on-rails ruby

我在railscast中遵循复杂的嵌套表单,并且我使它工作,在这里和那里进行一些调整。但问题是,如何在不使用控制器的情况下自动加载嵌套表单?

def new
  @model = Model.new
  @model.child.build
end
非常感谢!

2 个答案:

答案 0 :(得分:0)

  

如何在不使用的情况下自动加载嵌套表单   控制器?

简单(不正确)的答案是包含一个Partial,它将定义上面的ActiveRecord对象,如下所示:

#app/views/controllers/_your_partial.html.erb
<% model = Model.new %>
<% mode.child.build %>

<%= form_for model do |f| %>
...

问题与此相反,它违背了MVC programming pattern,这相当于Rails世界中的上帝

-

<强> MVC

你的问题很奇怪,因为它违背了Rails的核心要素之一:

enter image description here

这意味着您对Rails应用程序(通过URL)所做的每个请求都必须由controller action来满足。控制器的作用是配置/收集运行应用程序所需的data,然后为用户填充视图。

如果你想“在没有控制器的情况下调用表单”,你基本上就是说你想要反对这些约定。除非您创建gem(允许您在控制器外部推断ActiveRecord定义代码),否则您将不得不使用控制器。

虽然一招......

-

课程方法

您将能够在控制器中使用您正在使用的功能。创建一个class method来处理它:

#app/models/model.rb
Class Model < ActiveRecord::Base
    def self.build
        model = self.new
        model.child.build
        model
    end
end

这将允许您从控制器/部分呼叫以下内容:

@model = Model.build #-> instead of Model.new :)

答案 1 :(得分:0)

module ApplicationHelper
  def setup_person(person)
    returning(person) do |p|
      p.children.build if p.children.empty?
    end
  end
end

我在Ryan Daigle的网站上发现了这个,但我发现这有点过时了。我尝试了这个,但是我得到的返回没有定义或者没有方法。