从另一个模型渲染部分

我有一个用于模拟房屋的rails应用程序。 有一个房子模型有很多参数,它有很多has_many rooms 。 房间有house_id和名字。 我还使用了http://github.com/ryanb/complex-form-examples来允许将许多灯和small_appliances添加到房间。 complex-form-example使用RJS和partials来完成此任务。

有一个名为calculator的控制器,用户将用它来访问应用程序。 当按下计算器上的提交按钮时,它会重定向到add_rooms页面(位于app/views/calculator/add_rooms.html.erb )页面,用户可以在该页面中add rooms 。 add_rooms页面使用app/views/rooms/_room_form.html.erb 。 我无法显示,因为rails总是在app / views / calculator文件夹中查找内容。

我怎样才能显示它? 另请注意,我需要在保存房间时保存房屋的ID。

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

更新

如果我注释掉两个add_child_link 。 页面呈现。 但是,当我单击提交时,我收到一条新的错误消息:

 CalculatorController #add_room中的ActiveRecord :: AssociationTypeMismatch

 SmallAppliance(#49096610)预计,得到arrays(#1560620)

 RAILS_ROOT:C:/ Users / ryan / Downloads / react
应用程序跟踪| 框架跟踪| 完整跟踪

 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_proxy.rb:263:在`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:在`replace'中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_collection.rb:320:在'each'中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_collection.rb:320:在`replace'中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations.rb:1322:在`small_appliances ='中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2744:在`send'中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2744:在`attributes ='
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2740:在'each'中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2740:在`attributes ='中
 C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2438:在`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'

如果我删除了small_application部分,那么光会发生同样的事情。 我认为它与房间模型中的accepts_nested_attributes_for有关。 我已添加以下代码。 我也添加了house.rb代码。

应用程序/模型/ room.rb

 class Room  :destroy has_many :small_appliances, :dependent => :destroy validates_presence_of :name accepts_nested_attributes_for :lights, :reject_if => lambda { |a| a.values.all?(&:blank?) }, :allow_destroy => true accepts_nested_attributes_for :small_appliances, :reject_if => lambda { |a| a.values.all?(&:blank?) }, :allow_destroy => true end 

应用程序/模型/ house.rb

 class House < ActiveRecord::Base has_many :rooms # validation code not included def add_room(room) rooms << room end end 

应用程序/控制器/ calculator_controller.rb

 class CalculatorController  'add_rooms', :id => @house } format.xml { render :xml => @house, :status => :created, :location => @house } else format.html { render :action => 'index' } format.xml { render :xml => @house.errors, :status => :unprocessable_entity } end end end def add_rooms @house = House.find(params[:id]) @rooms = Room.find_by_house_id(@house.id) rescue ActiveRecord::RecordNotFound logger.error("Attempt to access invalid house #{params[:id]}") flash[:notice] = "You must create a house before adding rooms" redirect_to :action => 'index' end def add_room @house = House.find(params[:id]) @room = Room.new(params[:room]) respond_to do |format| if @room.save @house.add_room(@room) @house.save flash[:notice] = "Room \"#...@room.name}\" was successfully added." format.html { render :action => 'add_rooms' } format.xml { render :xml => @room, :status => :created, :location => @room } else format.html { render :action => 'add_rooms' } format.xml { render :xml => @room.errors, :status => :unprocessable_entity } end end rescue ActiveRecord::RecordNotFound logger.error("Attempt to access invalid house #{params[:id]}") flash[:notice] = "You must create a house before adding a room" redirect_to :action => 'index' end def report flash[:notice] = nil @house = House.find(params[:id]) @rooms = Room.find_by_house_id(@house.id) rescue ActiveRecord::RecordNotFound logger.error("Attempt to access invalid house #{params[:id]}") flash[:notice] = "You must create a house before generating a report" redirect_to :action => 'index' end end 

应用程序/视图/计算器/ add_rooms.html.erb

 

House id is

Your rooms:

  • has watt bulbs, in use for hours per day.

You have not added any rooms yet

'rooms/room_form' %>
"report", :id => @house %>

app / views / rooms / _room_ form.html.erb

  { :action => :add_room, :id => @house } do |form| %>  


Lights

'rooms/light', :locals => { :form => light_form } %>

Small Appliances

'rooms/small_appliance', :locals => { :form => sm_appl_form } %>

application_helper.rb

 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 => 'room_form' %>不是rails会认为它是app/views/calculator/_room_form.html.erb ,但是在<%= render:partial =>的情况下’rooms / room_form’%>它会假设它是app/views/rooms/_room_form.html.erb

观察您的日志 – 您将看到哪些部分被渲染

我知道这个问题已经过时但我遇到了同样的问题,并设法解决了这个问题。

具体来说,我也是关注ryan bates复杂forms的例子。

我的表单没有呈现相同的错误:

 undefined method `reflect_on_association' for NilClass:Class 

我注释掉了add_child_link帮助器和呈现的表单但是在提交后我得到了:

 ChildModel expected, got Array 

经过多次头疼后,我做了一个简单的修改,修复了一切:

 -- form_for :project ++ form_for @project 

没错,只需切换实例变量的符号就可以了。

希望这可以帮助任何被卡住的人

问题是,当您尝试添加子链接时,没有定义room对象。

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