【问题标题】:rails dynamic nested form data selectrails 动态嵌套表单数据选择
【发布时间】:2011-09-26 04:57:01
【问题描述】:

Rails 专家,您知道我一直在努力解决的这个问题的标准解决方案吗?

在我的应用中,用户可以为他的对象定义属性。因此,在生成他的对象列表(假设它们是书)之前,他可以指定他关心的属性及其潜在值,然后对于每本书,他必须为每个属性输入一个合法值。所以说我输入了我的属性:长度(合法值“长”、“短”)和难度(“容易”、“难”)。在不同的书架上,不同的书籍列表可能具有不同的属性(封面颜色“蓝色”或“红色”)

所以现在我处于我的书本形式。 “在这个书架上添加新书。”在部分方面,我提出了与这个书架上的一本新书相关的属性列表(长度和难度)。然后我查找每个属性的合法值。我有一个选择下拉列表,用户可以在其中选择一个:

<% for prop in @book.properties %>

<%= prop %> :

<%= f.collection_select :prop_value_select, prop.legal_property_values, :id, :name %>

<%end %>

在我的书籍模型中,我定义了一个虚拟属性,它将创建“连接记录”PropertyValue。 PropertyValue 有 legal_property_value_id 和 book_id。

def prop_value_select=(incoming_id_from_form)
    PropertyValue.create!(:legal_property_value_id => incoming_id_from_form, :book=> self)
end

整个方案都有效,除了我的方法只在表单提交时为第一个属性调用一次,而不是为每个属性调用一次。

我绞尽脑汁……看起来很简单,但是标准的 Rails 方法是什么?

  • 将所有属性收集到一个数组中并生成模型作为回调?
  • 每个属性都有部分魔法?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我认为问题在于您使用的是嵌套模型,并且所有字段都将具有相同的 id,因此 rails 只会存储一个嵌套元素。

    您应该使用fields_for,它允许您处理嵌套模型。 首先,您需要在模型中指定它将接受嵌套属性。添加以下行

    class Book
      has_many :properties
      accept_nested_attributes_for :properties
    end
    

    在你看来,你会写类似

    <% fields_for :properties do |prop| %>
      <%= prop %> :
      <%= f.collection_select ...
    <% end %>
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,我想这很接近了!我的问题不太准确:属性位于 book 的父模型上。所以它更像是遍历@bookshelf.properties. 但表单是为了一本书;即form_for[@bookshelf, @book]。所以fields_for 看不到@book.properties,只有@bookshelf.books. 有什么办法吗?
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多