【问题标题】:I'm looking for a good Rails source for this我正在为此寻找一个好的 Rails 资源
【发布时间】:2011-04-03 06:15:32
【问题描述】:

我想要一个很好的资源,了解如何设置控制器操作和表单,以便在它所属的另一个资源的视图内创建资源......

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 controller associations


    【解决方案1】:

    像往常一样设置您的控制器。您需要使用 Rails 的嵌套属性功能。这使您可以在使用一种表单创建父对象的同时创建子对象。

    This is my go-to link for nested attributes。如果您正在运行 Ruby 1.9.2,您需要进行的唯一更改是在 setup_person 帮助程序中。 returning 已被弃用,因此您可以将其更改为:

    def setup_person(person)
      person.tap do |p|
        p.children.build if p.children.empty?
      end
    end
    

    在典型的 Rails 风格中,这将正常工作为您的每个资源使用标准控制器。

    其他链接

    http://weblog.rubyonrails.org/2009/1/26/nested-model-forms

    http://jeffperrin.com/2009/06/04/rails-nested-forms-and-collection_select/

    【讨论】:

    • 这比嵌套资源好吗?
    • 其实是一回事。在上面的示例中,您将有一个普通的form_for 一个人,并且在该表单中,您将能够创建 x 个孩子。如果你的模型中有正常的关联声明accepts_nested_attributes_for,这将创建你想要的结构。
    • person 变量在您的 setup_person 方法中定义在哪里?
    • 抱歉,从我自己的一位助手那里截取了代码,忘记在方法定义中更改对帐户的引用。
    【解决方案2】:

    我没有记录我通常做的事情的网络资源,但我创建了一个 gist 记录我最常在这里做的事情:https://gist.github.com/900241


    要点的前提是你有一个项目模型有很多项目角色,并且你想在项目表单中编辑很多项目角色。这几乎是经典的accepts_nested_attributes_for 场景,几乎任何讨论它的页面都会给你一个不错的文章。问题是,我所看到的解决方案总是涉及一些非常混乱的突兀 JavaScript,这些 JavaScript 会逃脱整个表单视图并将其扔到链接的 onClick 方法中。我最近想出了一个使用 jQuery 模板的更简洁、不显眼的方法。

    当您移动到嵌套模型时,您不必对 ProjectsController 做任何事情。一切都在控制器级别工作,您甚至不需要 ProjectRolesController。 (这就是为什么我没有费心将它们包括在要点中的原因。)在模型级别,它只是标准的accepts_nested_attributes_for。有趣的地方在视图中。

    项目表单有两个 form_for 块:一个呈现 jQuery 模板,另一个呈现项目角色表单。反过来,jQuery 模板只是呈现项目角色表单(mmm DRY!),但来自 <script> 标记内,并且具有空白项目角色。因为表单在脚本标签内,它不会与项目表单一起提交,并且因为脚本类型是“text/x-jquery-tmpl”,所以这是完全有效的标记。

    当用户单击“添加项目角色”时,它会触发一些 jQuery,该 jQuery 采用模板中的表单,将索引替换为当前日期(这一切都是为了可以唯一标识该项目角色),并附加它到表单的项目角色部分的末尾。

    当用户单击项目角色旁边的“删除”时,它会检查该项目角色是否是新记录,如果不是,它会在表单末尾附加一个“_delete”隐藏字段。无论哪种情况,它都会从 DOM 中删除项目角色 div。

    【讨论】:

    • 我看到 Robin 已经将您链接到大多数流行的 accept_nested_attributes_for 文章...我仍然推荐我的方法,它只是建立在其他这些方法的基础上。这些旧文章中提到的 JavaScript 是我所说的非常混乱的突兀 JavaScript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多