使用表单字段创建另一个模型的数量的表单

时间:2017-10-02 14:37:33

标签: ruby-on-rails forms nested-forms rails-models

我有两个模型,HotelRoom。我想创建一个表格,允许我添加一个新的酒店和房间,表明酒店的名称和房间的数量。 我知道我应该使用“嵌套表单”,但我很难正确实现它。

这是我的代码:

HotelsController

class HotelsController < ApplicationController

  def index
    @hotels = Hotel.all
  end

  def new
    @hotel = Hotel.new
  end

  def create
    @hotel = Hotel.new(hotel_params)

    if @hotel.save
      redirect_to @hotel
    else
      render 'new'
    end           
  end

  def show
    @hotel = Hotel.find(params[:id])
  end

  def destroy
    @hotel = Hotel.find(params[:id])
    @hotel.destroy
    redirect_to hotels_url, notice: 'Hotel was successfully destroyed.'
  end

  private

  def hotel_params
    params.require(:hotel).permit(:name, :rooms_count)
  end
end

酒店模特

class Hotel < ApplicationRecord
  has_many :rooms, dependent: :destroy
  accepts_nested_attributes_for :rooms
end

房间模型

class Room < ApplicationRecord
    belongs_to :hotel, optional: true # avoiding rails 5.2 belongs_to error 
end

形式

<%= form_with scope: :hotel, url: hotels_path, local: true do |form| %>
  <p>
    <%= form.label :name %><br>
    <%= form.text_field :name %>
  </p>

  <p>
    <%= form.label :rooms_count %><br>
    <%= form.number_field :rooms_count %>
  </p>

  <p>
    <% form.fields_for :rooms  do |f|%>
      <p>
        **THE CODE**
      </p>
    <% end %>
  </p>

  <p>
    <%= form.submit %>
  </p>
<% end %>

2 个答案:

答案 0 :(得分:1)

你忘记了&#34; ERB回音标志&#34; =帮助器上的{fields_for}。

正确的表格:

  <%= form.fields_for :rooms do |f|%>

答案 1 :(得分:0)

我找到了解决问题的方法。

  def create
    @hotel = Hotel.new(hotel_params)
    @hotel.rooms_count.times do 
      @hotel.rooms.build
    end

    if @hotel.save
      redirect_to @hotel
    else
      render 'new'
    end           
  end

它实现了@hotel.rooms.build,与表格中的Rooms Count字段中输入的@ hotel.rooms_count数字一样多次。