本文介绍了Ruby on Rails从一种形式保存在两个表中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个型号的酒店和地址.关系是:

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 .您的newcreate方法应与此类似

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从一种形式保存在两个表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 05:15