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对象后保存地址。