2015-11-08 11 views
2

Мне нужно использовать вложенные формы по заданию, над которым я работаю, и я застрял, потому что мои вложенные атрибуты формы не отправляются в базу данных.Вложенные атрибуты формы не сохраняются

Вот что мой контроллер выглядит

def new 
    @booking = Booking.new 
    params[:no_of_passengers].to_i.times { @booking.passengers.build } 
end 

def create 
    @booking = Booking.new(booking_params) 

    respond_to do |format| 
    if @booking.save 
     format.html { redirect_to '/booking_confirmed', notice: 'Booking was successfully created.' } 
     format.json { render :show, status: :created, location: @booking } 
    else 
     format.html { render :new } 
     format.json { render json: @booking.errors, status: :unprocessable_entity } 
    end 
    end 
end 



private 

def booking_params 
    params.permit(
    :airline, :origin, :destination, :departure_date, :departure_time, :arrival_date, 
    :arrival_time, :flight_id, :price, :no_of_passengers, :user_id, :booking, 
    passenger_attributes: [ 
     :id,:booking_id, :name, :email,:done,:_destroy 
    ] 
) 
end 

Вот связь между моделями

class Booking < ActiveRecord::Base 
    has_many :passengers 

    accepts_nested_attributes_for :passengers, reject_if: lambda { |attributes| attributes['name'].blank? } 
end 


class Passenger < ActiveRecord::Base 
    belongs_to :bookings 
end 

А вот форма

<%= form_for @booking do |b| %> 
    <%= b.fields_for :passengers do |p| %> 
    <%= p.text_field :name, placeholder: "Passenger Name" %> 
    <%= p.text_field :email, placeholder: "Passenger Email" %> 
    <% end %> 
<% end %> 

Я проверил таблицу пассажира с помощью Passenger.all в консоли rails и ничего не возвращает.

Что я делаю неправильно?

+1

Можете ли вы показать нам отправленные параметры, которые вы получаете из своей формы? –

+0

, пожалуйста, покажите, какие значения являются параметрами 'params' и' booking_params', когда запрос отправлен. – tompave

+0

'Start POST"/заказы "для 127.0.0.1 в 2015-11-08 14:00:49 +0100 Обработка BookingsController # создать в HTML Параметры: { "utf8" => "✓", "authenticity_token" => "S95Splfs70P954xJ/AN8t9k8E8OBvwCRdwrx5nSSwziLo/GFF4I102/cbB3ZUDToz/oofuwZCQIr9tEmsZ + W4w == "," booking "=> {" flight_id "=>" 608 "," user_id "=>" "," no_of_passengers "=>" "," passengers_attributes "=> {" 1446987645041 "=> {" имя "=>" ade "," email "=>" ade "," _destroy "=>" false "}}}," commit "=>" Book Now "} Параметр unpersmitted: messages_attributes ' –

ответ

0

После сеанса сопряжения с sunnyk я смог увидеть ошибки.

Первая ошибка в том, что у моего class Passenger есть belongs_to :bookings вместо belongs_to :booking. Однако это распространенная ошибка. Объединения между этими классами теперь выглядят следующим образом:

class Booking < ActiveRecord::Base 
    belongs_to :flight 
    has_many :passengers 
    accepts_nested_attributes_for :passengers, reject_if: 
    lambda {|attributes| attributes['name'].blank?}, :allow_destroy => true 
end 

class Passenger < ActiveRecord::Base 
    belongs_to :booking 
end 

class Flight < ActiveRecord::Base 
    has_many :bookings 
    has_many :passengers, through: :bookings 
    accepts_nested_attributes_for :passengers 
    accepts_nested_attributes_for :bookings 
end 

Следующие: Вместо того, чтобы использовать значение по умолчанию no_of_passengers для построения моей вложенной формы, я использовал cocoon драгоценный камень, который делает вложенные формы здания и управление проще. Я также разработал новый метод params, в котором я сделал разрешенный flight_id, а затем передал его в качестве аргумента для моего экземпляра бронирования в моем методе new рядом с моим номером current user. Итак, теперь мой метод new выглядит так.

def new 
    @booking = Booking.new(new_booking_params) 
    @booking.user = current_user if current_user 
end 

def new_booking_params 
    params.permit(:flight_id) 
end 

После этого я должен был сделать еще один params метода для моего create метода, таким образом, чтобы параметры, которые я хочу в bookings таблицы, это включает passengers_attributes. Теперь мой метод create выглядит следующим образом.

def create 
    @booking = Booking.new(another_booking_params) 
    respond_to do |format| 
    if @booking.save 
    format.html { redirect_to '/booking_confirmed', notice: 'Booking was successfully created.' } 
    format.json { render :show, status: :created, location: @booking } 
    else 
    format.html { render :new } 
    format.json { render json: @booking.errors, status: :unprocessable_entity } 
    end 
end 
end 

def another_booking_params 
    params.require(:booking).permit(:flight_id, :user_id, :no_of_passengers, 
    passengers_attributes:[:name, :email]) 
end 

Наконец, мне пришлось настроить свою форму, чтобы выглядеть так.

<%= form_for(@booking, url: bookings_path) do |f| %> 
    <%= f.hidden_field(:flight_id)%> 
    <%= f.hidden_field(:user_id) %> 
    <%= f.hidden_field(:no_of_passengers)%> 
    <%= f.fields_for :passengers do |passenger| %> 
    <%= render 'passenger_fields', :f => passenger %> 
    <% end %> 
    <%= link_to_add_association 'Add Another passenger',f, :passengers, :class => 'btn btn-primary add' %> 
    <%= submit_tag "Book Now", class: "btn btn-primary book" %> 
<% end %> 

и passenger_fields частичный выглядит.

<div class="nested-fields form-inline"> 
<div class="form-group"> 
    <%= f.text_field :name, :class => "form-control", placeholder: "Passenger Name" %> 
    </div> 
    <div class="form-group"> 
    <label>-</label> 
    <%= f.text_field :email, :class => "form-control", placeholder: "Passenger Email" %> 
    </div> 
    <div class="links pull-right"> 
    <%= link_to_remove_association "Delete", f, class: "btn btn-danger" %> 
    </div> 
    <hr> 
</div> 

Все, что сделал трюк. Надеюсь, это поможет другим лучше понять вложенные формы.

Смежные вопросы