【问题标题】:Creating a nested model form创建嵌套模型表单
【发布时间】:2011-01-05 03:34:15
【问题描述】:

我正在尝试构建一个多模型表单 - 但其中一个问题是我需要在表单中链接模型。

例如,假设我的表单具有以下模型:用户、个人资料

创建新用户时,我想同时创建一个新的个人资料,然后将两者关联起来。问题是,如果两者都还没有创建,那么它们还没有 ID - 那么如何分配链接值?

谢谢!

-艾略特

我注意到,有些人喜欢这个 - 要查看有关链接两个模型的更多信息,请查看我的第二个问题,它有答案:Linking two models in a multi-model form

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 nested-forms


    【解决方案1】:

    实现预期结果的一种方法是您可以制作一个利用 Rails 中的嵌套属性支持的表单:

    <%= form_for(@user) do |f| %>
      <%= f.label :my_user_attribute %>
      <%= f.text_field :my_user_attribute %>
    
      <%= f.fields_for :profile do |fp| %>
        <p>
          <%= fp.label :my_profile_attribute %>
          <%= fp.text_field :my_profile_attribute %>
        </p>
      <% end %>    
    
      <%= f.submit %>
    <% end %>
    

    您还需要将以下内容添加到您的用户类中:

    accepts_nested_attributes_for :profile
    

    您可以阅读有关 Active Record 嵌套属性的更多信息here。 您可以阅读更多关于 ActionView 表单助手here 的信息(在页面下方搜索“嵌套属性示例”)。

    如果您使用这种方法,并在两个模型上进行良好的验证,您就不必担心跟踪数据库 ID,因为 ActiveRecord 将同时创建两者(但直到两个模型对象都有效)。

    【讨论】:

    • 嗨,斯科特,感谢您的回复!我不确定我是否理解您发布的代码 - 我试过了,但出现未定义的变量或方法“fp”错误?
    • 嗨 Elliot - 我已经更新了我的代码 - 我犯了一个错误。前几个表单构建器变量应该是 'f' 而不是 'fp' (更新了第 2 行和第 3 行)。道歉 - 写得太快了!本质上,该代码允许您为父子关联对象执行嵌套的表单输入字段。
    • 谢谢斯科特!我按你说的更新了,form_for(@users)出现了,但是fields_for profile部分在查看的时候好像隐藏了?
    • 好的,那么你就快到了。 fields_for(如 form_for)只会为存在的对象(非 Nil)生成表单字段。因此,在您的控制器中(在您的“新”操作中)您创建一个新用户,例如'@user = User.new',您还需要添加一行,在您的@user 上创建一个空的新配置文件对象...例如'@user.profile = Profile.new'
    • 很高兴听到这个消息。最后一件事:如果在某个时候您开始通过在用户模型中使用“attr_accessible”来加强应用程序的安全性,那么您还需要将 :profile_attributes 添加到该“可访问”列表中,以便嵌套表单属性成为在@user.profile 上更新(就像现在一样)。如果这没有意义,那么希望它会在您需要时为您指明正确的方向(谷歌的东西):-)
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多