Ruby on rails 从另一个模型渲染部分

Ruby on rails 从另一个模型渲染部分,ruby-on-rails,model,render,partial,Ruby On Rails,Model,Render,Partial,我有一个rails应用程序,可以为房子建模。有一个房屋模型有许多参数,它有许多房间。一个房间有一个房屋id和一个名字。我还曾经允许在房间里添加许多灯光和小家电。复杂表单示例使用RJ和partials来实现这一点 有一个名为calculator的控制器,用户将使用该控制器访问应用程序。当按下计算器上的提交按钮时,它会重定向到一个添加房间页面(位于app/views/calculator/add_rooms.html.erb)页面,用户可以在该页面中添加房间。“添加房间”页面使用来自app/view

我有一个rails应用程序,可以为房子建模。有一个房屋模型有许多参数,它有许多房间。一个房间有一个
房屋id
和一个名字。我还曾经允许在房间里添加许多灯光和
小家电。复杂表单示例使用RJ和partials来实现这一点

有一个名为calculator的控制器,用户将使用该控制器访问应用程序。当按下计算器上的提交按钮时,它会重定向到一个
添加房间
页面(位于
app/views/calculator/add_rooms.html.erb
)页面,用户可以在该页面中
添加房间
。“添加房间”页面使用来自
app/views/rooms/\u room\u form.html.erb
的部分文件。由于rails总是在app/views/calculator文件夹中查找内容,因此我无法将其显示出来

我怎样才能把它展示出来?还请注意,在保存房间时,我需要保存房子的id

以下是所有相关代码(我希望):

更新 如果我注释掉这两个
add\u child\u链接
。页面将呈现。但是,当我单击“提交”时,会收到一条新的错误消息:

ActiveRecord::AssociationTypeMismatch in CalculatorController#add_room SmallAppliance(#49096610) expected, got Array(#1560620) RAILS_ROOT: C:/Users/ryan/Downloads/react Application Trace | Framework Trace | Full Trace C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_proxy.rb:263:in `raise_on_type_mismatch' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_collection.rb:320:in `replace' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_collection.rb:320:in `each' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_collection.rb:320:in `replace' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations.rb:1322:in `small_appliances=' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2744:in `send' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2744:in `attributes=' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2740:in `each' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2740:in `attributes=' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2438:in `initialize' C:/Users/ryan/Downloads/react/app/controllers/calculator_controller.rb:31:in `new' C:/Users/ryan/Downloads/react/app/controllers/calculator_controller.rb:31:in `add_room' app/models/house.rb 应用程序\u helper.rb 谢谢,

Ryan

非常奇怪-如果您编写
'room\u form%%>
,rails会假定它是
app/views/calculator/\u room\u form.html.erb
,但在“rooms/room\u form%%的情况下,它会假定它是
app/views/rooms/\u room\u form.html.erb


查看您的日志-在那里您将看到渲染了哪些片段

问题在于,您在尝试添加子链接时没有定义
房间
对象

render :partial => 'rooms/room_form', :object => Room.new

我知道这个问题很老,但我遇到了同样的问题,并设法解决了它

具体地说,我也遵循了ryan bates的复杂表单示例

我的表单未呈现,出现相同错误:

undefined method `reflect_on_association' for NilClass:Class
我注释掉了add_child_link helper和呈现的表单,但提交后我得到:

ChildModel expected, got Array
在做了很多头饰之后,我做了一个简单的改变,修复了一切:

-- form_for :project
++ form_for @project
没错,只要切换一个实例变量的符号就可以了


希望这能帮助其他陷入困境的人

当我使用
render:partial=>“rooms/rooms\u form”
时,我会遇到以下错误:显示app/views/rooms/rooms\u roomm\u form.html.erb,其中第13行出现:未定义的方法“reflect\u on\u association”用于NilClass:Class这来自add\u child\u链接调用。我在原来的帖子中添加了application_helper.rb。
<% form_for :room, :url => { :action => :add_room, :id => @house } do |form| %>
  <%= form.error_messages %>
  <p>
    <%= form.label :name %><br />
    <%= form.text_field :name %>
  </p>

  <h3>Lights</h3>
  <% form.fields_for :lights do |light_form| %>
    <%= render :partial => 'rooms/light', :locals => { :form => light_form } %>
  <% end %>
  <p class="addLink"><%= add_child_link "[+] Add new light", form, :lights %></p>

  <h3>Small Appliances</h3>
  <% form.fields_for :small_appliances do |sm_appl_form| %>
    <%= render :partial => 'rooms/small_appliance', :locals => { :form => sm_appl_form } %>
  <% end %>
  <p class="addLink"><%= add_child_link "[+] Add new small appliance", form, :small_appliances %></p>

  <p><%= form.submit "Submit" %></p>
<% end %>
module ApplicationHelper
  def remove_child_link(name, form)
    form.hidden_field(:_delete) + link_to_function(name, "remove_fields(this)")
  end

  def add_child_link(name, form, method)
    fields = new_child_fields(form, method)
    link_to_function(name, h("insert_fields(this, \"#{method}\", \"#{escape_javascript(fields)}\")"))
  end

  def new_child_fields(form_builder, method, options = {})
    options[:object] ||= form_builder.object.class.reflect_on_association(method).klass.new
    options[:partial] ||= method.to_s.singularize
    options[:form_builder_local] ||= :form
    form_builder.fields_for(method, options[:object], :child_index => "new_#{method}") do |form|
      render(:partial => options[:partial], :locals => { options[:form_builder_local] => form })
    end
  end
end
render :partial => 'rooms/room_form', :object => Room.new
undefined method `reflect_on_association' for NilClass:Class
ChildModel expected, got Array
-- form_for :project
++ form_for @project