Techioz Blog

Rails Form Helper が正しいサブハッシュを使用しないのはなぜですか?

概要

BookingAccommodation モデルのインスタンスを作成するフォームがあります。このモデルは宿泊施設に属しており、internal_name を持っています。

<%= form_with model: @booking_accommodation, url: property_settings_accommodations_type_booking_accommodations_path(@accommodation) do |f| %>
    <div class="flex flex-col">
        <%= f.label :internal_name %>
        <%= f.text_field :internal_name, class: "border" %>
    </div>
    
    <div>
        <%= f.submit %>
    </div>
<% end %>
class Property::Settings::Accommodations::BookingAccommodationsController < PropertyController
    def create
        @accommodation = Accommodation.find(params[:type_id])
        @booking_accommodation = @accommodation.booking_accommodations.new(booking_accommodation_params)

        if @booking_accommodation.save
            redirect_to edit_property_settings_accommodations_type_path(@accommodation)
        else
            # Handle error
        end
    end
    
    private

    def booking_accommodation_params
        params.require(:booking_accommodation).permit(:internal_name)
    end
end

生成された text_field の HTML は次のとおりです。

<input class="border" type="text" name="internal_name" id="internal_name">

ただし、これには次のようなbooking_accommodationサブハッシュが必要です。

<input class="border" type="text" name="booking_accommodation[internal_name]" id="internal_name">

サブハッシュがない場合、パラメータはネストされず、フォームはエラーになります。何が原因なのでしょうか?

解決策

create メソッドを示しているという事実は、それが最初にフォームをレンダリングする新しいメソッドであること、したがってどこに ivars を設定する必要があるのかを理解していないことを強く示唆しています。