Rails – 一种forms到两种模式

我正在Rails(版本4.2.5)中构建一个表单来收集有关商店的基本信息,我希望将表单提交给两个单独的模型 – 一个名为Store,它收集有关商店的信息,一个名为Address ,它只保存地址信息。 我已经看到这个问题浮在Stack和其他地方,但我对Rails很新,可以使用更多的逐步指导。 (另外,我知道Rails地理编码器的gem,但不想在这个项目中使用它,尽管我正在收集地址和纬度/长信息)

对于初学者,这是我的商店和地址模型……

class Store < ActiveRecord::Base belongs_to :user belongs_to :store_type has_one :address end class Address < ActiveRecord::Base belongs_to :store end 

和我的StoresController ……

 class StoresController < ApplicationController def new @store = Store.new @storeType = StoreType.all end def create @store = Store.new(store_params) @store.user = current_user if @store.save flash[:notice] = "New store created" redirect_to root_path else #ERROR STUFF end end private def store_params params.require(:store).permit(:user_id, :store_type_id, :latitude, :longitude, :name, :notes) end end 

最后,创建新商店的表格(不包括地址)……

   "latitude_field" %>  "longitude_field" %> 

因此,完成的表单将上述字段传递给Store模型,还应包括street,city,state和zip的字段,这些字段将传递给Address模型。

总的来说,最好的办法是什么?

并且,作为后续问题,我的地址模型有一个store_id列 – 如果正在创建存储和地址模型从同一表单填充,此列是否会自动填充商店的ID? 或者我在这里退出了联盟?

谢谢。

您最好关注accepts_nested_attributes_for

 #app/models/store.rb class Store < ActiveRecord::Base has_one :address accepts_nested_attributes_for :address end #app/controllers/stores_controller.rb class StoresController < ApplicationController def new @store = current_user.stores.new @store.build_address end def create @store = current_user.stores.new store_params @store.save end private def store_params params.require(:store).permit(:store_type_id, :latitude, :longitude, :name, :notes, address_attributes: [:line_1]) end end #app/views/stores/new.html.erb <%= form_for @store do |f| %> <%= f.fields_for :address do |a| %> <%= a.text_field :line_1 %> <% end %> <%= f.submit %> <% end %> 

您可以在Store模型中使用accept_nested_attributes_for :address ,然后使用fields_for实例化fields_for

像这样的东西:

 class Store < ActiveRecord::Base has_one :address accept_nested_attributes_for :address end class StoresController < ApplicationController def new @store = Store.new @store.build_address end end <%= form_for @store do |f| %> <%= f.fields_for @store.address do |ff| %> 

您还需要在StoreController中将address_attributes列入白名单,并在保存Store对象后保存地址。