Ruby on rails 基于现有资源的表单挑战Rails问题

Ruby on rails 基于现有资源的表单挑战Rails问题,ruby-on-rails,forms,associations,Ruby On Rails,Forms,Associations,您有一组通过脚手架创建的相关模型,例如房屋,它有许多房间,每个房间都有许多窗户,每个窗户都有可选择的锁。 这些资源已经充满了数据,即有人输入了所有信息,例如:一个名为“厨房”的房间有各种与其关联的窗口,这些窗口都有五种不同的锁 有人走过来说: 您是否可以创建一个表单,让用户创建一个新项目,在该项目中,他们可以选择不同的房间、窗口,然后指定他们希望为该项目使用的锁?(这些已经在系统中,没有新增内容,只是新项目的关联) 这听起来像是一个嵌套表单,但我已经浪费了很多时间试图解决这个问题-有很多层次的嵌

您有一组通过脚手架创建的相关模型,例如房屋,它有许多房间,每个房间都有许多窗户,每个窗户都有可选择的锁。
这些资源已经充满了数据,即有人输入了所有信息,例如:一个名为“厨房”的房间有各种与其关联的窗口,这些窗口都有五种不同的锁

有人走过来说:

您是否可以创建一个表单,让用户创建一个新项目,在该项目中,他们可以选择不同的房间、窗口,然后指定他们希望为该项目使用的锁?(这些已经在系统中,没有新增内容,只是新项目的关联)


这听起来像是一个嵌套表单,但我已经浪费了很多时间试图解决这个问题-有很多层次的嵌套,这使得这很棘手。有什么建议吗?

是的,这是一个嵌套表单。这是一个很好的起点

如果系统中已经有了所有内容,您可能只需要选择框,这样他们就可以选择想要的内容。还要检查.build方法。如果您有多个嵌套级别,您也可以通过自己传递外键来手动设置关联。

基于会话的解决方案 有了这样深度嵌套的模型,前端的选择框是不够的。。。 假设这样,您可能希望创建一个当前的_house,其id在会话中活动(就像当前的_用户工作一样)

一旦您拥有了当前的\u房屋,请导航到“项目列表”视图并单击“添加到”链接,添加不同的项目:

  # house_controller.rb
  def add_to
    current_house.polymorphic_items << Kitchen.find(params[:id])
    redirect_to :back
  end
#house_controller.rb
def添加到

current_house.polymorphic_items我认为,鉴于以下模型(基于预先存在的窗口/锁,一个房间只需要将它们混合并匹配到一组具有给定锁的窗口中),您可以使用单级嵌套属性对此进行建模:


您应该将标题更改为与您的问题相关。@J Lundberg,我已经更新了。我刚刚为此添加了一个悬赏。如果需要进一步澄清,请让我知道:)我认为有一件事应该在你的例子中澄清。每个房间都是一所房子所独有的(如父母有多个孩子),还是HBTM或有多个通过关系(如订单中有多个产品通过选择的项目),因为在第一种情况下,选择范围应该是有限的,并且可以通过(增强的)选择框解决,如果它是第二种类型的关系选择框通常是个坏主意…@charlysisto,它与您的第二个示例相同,即,就像一个订单有许多产品。如何用现有数据填充它?我所需要做的就是建立关联,而不是像您的示例那样输入新数据。谢谢。我喜欢不超过1级的想法。由主表单提交的一系列表单是否是一种解决方法?(可能是通过使用Ajax和partials)实际上,使用回调来下拉数据以调用更深层次的嵌套数据会有所帮助。但我会尽量让它在没有js 1st的情况下工作(优雅地降级)。此外,你可以考虑使用,但我承认我从来没有使用过它们。
before_filter :set_current_item

def add_to
  current_item.windows << Window.find(id)
end
class House < ActiveRecord::Base
  has_many :rooms
end

class Room < ActiveRecord::Base
  belongs_to :house
  has_many :window_configs
end

class WindowConfig < ActiveRecord::Base
  belongs_to :room
  belongs_to :window
  belongs_to :lock
end

class Lock < ActiveRecord::Base
  has_many :window_configs
end

class Window < ActiveRecord::Base
  has_many :window_configs
end
form_for :house do |form|
  # Dynamically add a Room form for each room you want with js
  form.fields_for :room do |room_attributes|
    room_attributes.text_field :name
    # Dynamically add window_config forms on Room w/ JS
    room_attributes.fields_for :window_config do |window_attributes|
      window_attributes.select :window_id, Window.all
      window_attributes.select :lock_id, Lock.all