问题描述
我有两个型号的酒店和地址.关系是:
I have two models Hotel and Address.Relationships are:
class Hotel
belongs_to :user
has_one :address
accepts_nested_attributes_for :address
和
class Address
belongs_to :hotel
我需要通过一种表格保存在酒店表和地址表中.
And I need to save in hotels table and in addresses table from one form.
输入形式很简单:
<%= form_for(@hotel) do |f| %>
<%= f.text_field :title %>
......other hotel fields......
<%= f.fields_for :address do |o| %>
<%= o.text_field :country %>
......other address fields......
<% end %>
<% end %>
酒店负责人:
class HotelsController < ApplicationController
def new
@hotel = Hotel.new
end
def create
@hotel = current_user.hotels.build(hotel_params)
address = @hotel.address.build
if @hotel.save
flash[:success] = "Hotel created!"
redirect_to @hotel
else
render 'new'
end
end
但是此代码不起作用.
添加1 Hotel_params:
ADD 1Hotel_params:
private
def hotel_params
params.require(:hotel).permit(:title, :stars, :room, :price)
end
ADD 2
主要问题是我不知道如何正确渲染表单.此^^^表单甚至不包含地址字段(国家/地区,城市等).但如果在行中
The main problem is I don't know how to render form properly. This ^^^ form doesn't even include adress fields (country, city etc.). But if in the line
<%= f.fields_for :address do |o| %>
我将:address更改为:hotel,我得到了表单中的地址字段,但是在这种情况下,当然没有任何内容保存在:address表中.我不明白从1种表格中保存2张表的原理,非常抱歉,我是Rails的新手...
I change :address to :hotel, I get address fields in the form, but of course nothing saves in :address table in this case. I don't understand the principle of saving in 2 tables from 1 form, I'm VERY sorry, I'm new to Rails...
推荐答案
您正在使用 wrong method
将孩子与父母联系在一起,并且它也是 has_one relation
,因此您应使用 build_model
而不是 model.build
.您的new
和create
方法应与此类似
You are using wrong method
for appending your child with the parent.And also it is has_one relation
,so you should use build_model
not model.build
.Your new
and create
methods should be like this
class HotelsController < ApplicationController
def new
@hotel = Hotel.new
@hotel.build_address #here
end
def create
@hotel = current_user.hotels.build(hotel_params)
if @hotel.save
flash[:success] = "Hotel created!"
redirect_to @hotel
else
render 'new'
end
end
更新
您的hotel_params
方法应如下所示
def hotel_params
params.require(:hotel).permit(:title, :stars, :room, :price,address_attributes: [:country,:state,:city,:street])
end
这篇关于Ruby on Rails从一种形式保存在两个表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!