tag recursos rails formularios form anidados ruby-on-rails ruby-on-rails-4

ruby on rails - recursos - Intentando hacer un formulario usando atributos anidados



formularios en ruby on rails (1)

Creo que tus relaciones están un poco desordenadas, así es como creé nuevas relaciones.

class AddRelevantModels < ActiveRecord::Migration def change create_table :car_rentals do |t| t.string :name t.timestamps null: false end create_table :cars do |t| t.string :model t.string :car_number t.belongs_to :car_rental, index: true, foreign_key: true t.timestamps null: false end create_table :clients do |t| t.string :full_name t.integer :age t.string :email t.string :phone_number t.timestamps null: false end create_table :reservations do |t| t.belongs_to :car, index: true, foreign_key: true t.belongs_to :client, index: true, foreign_key: true t.datetime :start_date t.datetime :end_date t.timestamps null: false end end end

car_rental.rb

class CarRental < ActiveRecord::Base has_many :cars end

car.rb

class Car < ActiveRecord::Base has_many :reservations has_many :clients, through: :reservations end

reservation.rb

class Reservation < ActiveRecord::Base belongs_to :client belongs_to :car accepts_nested_attributes_for :client accepts_nested_attributes_for :car end

client.rb

class Client < ActiveRecord::Base has_many :reservations has_many :cars, through: :reservations end

reservations_controller.rb

class ReservationsController < ApplicationController def new @reservation = Reservation.new @reservation.build_client end def create @reversation = Reservation.new(reservation_params) if @reversation.save render :show, id: @reservation else render :new end end private def reservation_params params.require(:reservation) .permit( :start_date, :end_date, client_attributes: [:full_name, :age, :email, :phone_number] ) end end

reservations/new.html.erb

<h1>Reservations</h1> <%= form_for(@reservation) do |f| %> <%= f.label :start_date %> <%= f.text_field :start_date %> <br> <%= f.label :end_date %> <%= f.text_field :end_date %> <br> <%= f.fields_for :client do |client_field| %> <%= client_field.label :full_name %> <%= client_field.text_field :full_name %> <br> <%= client_field.label :age %> <%= client_field.text_field :age %> <br> <%= client_field.label :email %> <%= client_field.text_field :email %> <br> <%= client_field.label :phone_number %> <%= client_field.text_field :phone_number %> <% end %> <br> <%= f.submit %> <% end %>

Ahora, si envía el formulario, puede ver en su base de datos que el cliente también está guardado para la reserva.

Reservation.first.client Reservation Load (0.5ms) SELECT "reservations".* FROM "reservations" ORDER BY "reservations"."id" ASC LIMIT 1 Client Load (0.4ms) SELECT "clients".* FROM "clients" WHERE "clients"."id" = $1 LIMIT 1 [["id", 1]] => #<Client id: 1, full_name: "remis", age: 22, email: "[email protected]", phone_number: "1231331", created_at: "2016-06-13 06:28:37", updated_at: "2016-06-13 06:28:37">

Soy un principiante en los rieles, así que estoy quiete pegado con los atributos anidados.

Aquí hay una descripción general de lo que estoy buscando:

Un auto de alquiler puede crear autos. (Hecho)

Los clientes pueden reservar un automóvil.

Los clientes son creados con la reserva al mismo tiempo por el rentalcar.

Estoy tratando de hacer un formulario de reserva que contendrá tanto el cliente como la información de la reserva, ya que será el alquiler el que llene todas las informaciones.

Es por eso que necesito usar atributos anidados, pero hasta ahora tengo algunas dificultades. Tengo cuatro modelos:

class Car < ActiveRecord::Base belongs_to :rentalcar has_many :photos has_many :reservations end

.

class Client < ActiveRecord::Base has_many :reservations end

.

class Reservation < ActiveRecord::Base belongs_to :client belongs_to :car end

.

class rentalcar < ActiveRecord::Base has_many :cars has_many :reservations end

La forma :

<%= form_for([@car, @car.reservations.new]) do |f| %>

<div class="row"> <div class="col-md-12 price_tag"> <span><%= @car.price %>Dhs</span> <span class="pull-right">Par jour</span> </div> </div> <div class="row"> <div class="col-md-6"> <label>Nom</label> <%= f.text_field :nom, placeholder: ''Nom'', class: ''form-control'' %> </div> <div class="col-md-6"> <label>Prenom</label> <%= f.text_field :prenom, placeholder: ''Prenom'', class: ''form-control'', disabled: ''true'' %> </div> </div> <div class="row"> <div class="col-md-6"> <label>CIN</label> <%= f.text_field :cin, placeholder: ''CIN'', class: ''form-control'' %> </div> <div class="col-md-6"> <label>Age</label> <%= f.text_field :age, placeholder: ''Age'', class: ''form-control'', disabled: ''true'' %> </div> </div> <div class="row"> <div class="col-md-6"> <label>Ville</label> <%= f.text_field :ville, placeholder: ''Ville'', class: ''form-control'' %> </div> <div class="col-md-6"> <label>Télephone</label> <%= f.text_field :telephone, placeholder: ''Telephone'', class: ''form-control'', disabled: ''true'' %> </div> </div> <div class="row"> <div class="col-md-6"> <label>Email</label> <%= f.text_field :email, placeholder: ''Email'', class: ''form-control'' %> </div> </div> <%= f.fields_for :reservations do |reservation_form| %> <div class="row"> <div class="col-md-6"> <label>Check In</label> <%= reservation_form.text_field :start_date, readonly: ''true'', placeholder: ''Start Date'', class: ''form-control'' %> </div> <div class="col-md-6"> <label>Check Out</label> <%= reservation_form.text_field :end_date, readonly: ''true'', placeholder: ''End Date'', class: ''form-control'', disabled: ''true'' %> </div> </div> <%= reservation_form.hidden_field :car_id, value: @car.id %> <%= reservation_form.hidden_field :price, value: @car.prix %> <%= reservation_form.hidden_field :total, id: ''reservation_total'' %> <% end %> <h4><span id="message"></span></h4> <div id="preview" style="display: none"> <table class="reservation-table" > <tbody> <tr> <td>Day(s)</td> <td><span id="reservation_days"></span></td> </tr> <tr> <td>Total</td> <td><span id="reservation_sum"></span>Dhs</td> </tr> </tbody> </table> <br> </div> <br> <%= f.submit "Book Now", id:"btn_book", class: "btn btn-primary wide", disabled: ''true'' %>

Entonces la idea es obtener este formulario después de hacer algo como: cars / 1 / reservate. Y tendremos algo como esto en el controlador:

def reservate @car = Car.find(params[:id]) @client = Client.new @client.reservations.build end

pero no sé en qué controlador debería permanecer

Edit1:

Índices:

add_index "reservations", ["client_id"], name: "index_reservations_on_client_id", using: :btree add_index "reservations", ["car_id"], name: "index_reservations_on_car_id", using: :btree add_index "voitures", ["rentelcar_id"], name: "index_voitures_on_rentelcar_id", using: :btree add_foreign_key "reservations", "clients" add_foreign_key "reservations", "cars" add_foreign_key "cars", "rentelcars"