J'ai cette erreur de routage lorsque j'ajoute une consommation (après que la soumission échoue) et que je suis bloqué, que fais-je mal?

Un utilisateur peut avoir plusieurs voitures et pour chacune de ses voitures il souhaite s'occuper de ses consommations de gaz.

J'ai trois modèles de disques actifs

create_table "cars", force: :cascade do |t|
    t.string "car_name"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "consumption_searches", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "consumptions", force: :cascade do |t|
    t.float "total_price"
    t.float "kilometers"
    t.string "shop"
    t.float "liter_price"
    t.float "total_liters"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "car_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end
  • voiture belongs_to :users et has_many :consumptions
  • utilisateur has_many :cars et has_many :consumptions through: :cars
  • consommation belong_to :car et belongs_to :user

Ma méthode de création dans consumptions_controller.rb

def create 
    @car = Car.find(params[:car_id])
    @consumption = Consumptions.new(consumption_params)
    @consumption.car = @car
  if @consumption.save!
    redirect_to car_consumptions_path, notice: 'consumption was successfully created.'
  else
    render :new
  end
end

cars_controller.rb

def show
    @car = Car.find(params[:id])
    @search = ConsumptionSearch.new(params[:search])
    @consumptions = @search.date_range
    @consumptions = @consumptions.order('created_at ASC').where(car_id: @car.id)
end

vues / consommations / _form.html.erb

<%= simple_form_for car_consumptions_path do |f| %>
...
<% end %>

routes.rb

Rails.application.routes.draw do
  devise_for :users
    root to: "cars#index"

    resources :cars do
        resources :consumptions
    end
end

itinéraires ferroviaires | consommation de grep

  car_consumptions GET    /cars/:car_id/consumptions(.:format)                                                     consumptions#index
                          POST   /cars/:car_id/consumptions(.:format)                                                     consumptions#create
      new_car_consumption GET    /cars/:car_id/consumptions/new(.:format)                                                 consumptions#new
     edit_car_consumption GET    /cars/:car_id/consumptions/:id/edit(.:format)                                            consumptions#edit
          car_consumption GET    /cars/:car_id/consumptions/:id(.:format)                                                 consumptions#show
                          PATCH  /cars/:car_id/consumptions/:id(.:format)                                                 consumptions#update
                          PUT    /cars/:car_id/consumptions/:id(.:format)                                                 consumptions#update
                          DELETE /cars/:car_id/consumptions/:id(.:format)                                                 consumptions#destroy

Comme demandé entrez la description de l'image ici

ÉDITER

Voici ce que j'ai dans le HTML si cela peut aider:

<form novalidate="novalidate" class="simple_form /cars/1/consumptions" action="/cars/1/consumptions/new" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="authenticity_token" value="0nwq/pQSXCU2ptBjbewTCBffPLpZZUPAj6/HPQTGtYd8cHz9zv8R/C/JYnXPDpKw5o3/vGlVtav2Sa2nSvgOQdQ==">
0
johan 20 nov. 2018 à 19:46

4 réponses

Meilleure réponse

Commençons par le contrôleur

# GET /cars/:car_id/consumptions/new
def new
  @car = Car.find(params[:car_id])
  @consumption = @car.consumptions.new
end

# POST /cars/:car_id/consumptions
def create 
  @car = Car.find(params[:car_id])
  @consumption = @car.consumptions.new(consumption_params)
  # `.save!` will raise an exception and blow up if the record is invalid. 
  # Not good.
  if @consumption.save
    redirect_to car_consumptions_path(@car), notice: 'consumption was successfully created.'
  else
    render :new
  end
end

Notez la redirection:

# consumptions#index
redirect_to car_consumptions_path(@car), notice: 'consumption was successfully created.'

Puisqu'il s'agit d'une route imbriquée, vous devez fournir le segment car_id.

Vous pouvez également rediriger vers:

# consumptions#show
redirect_to [@car, @consumption], notice: 'consumption was successfully created.'
# or to cars#show
redirect_to @car, notice: 'consumption was successfully created.'

Lorsque vous utilisez simple_form_for, vous lui transmettez des instances de modèle auxquelles il lie le formulaire. Lors de la création de formulaires pour les routes imbriquées, vous devez transmettre un tableau:

<%= simple_form_for([@car, @consumption]) do |f| %>

<% end %>

Cela utilise les aides de route polymorphes pour trouver le bon chemin. Vous pouvez utiliser cette même signature pour link_to, redirect_to, url_for et path_for.

Lorsque vous déclarez des routes imbriquées, vous devez envisager en utilisant l'option shallow . Il imbrique uniquement les routes de collection (nouveau, créer, indexer) et non les routes membres.

1
max 20 nov. 2018 à 21:29

Vous n’affichez pas votre action new, mais je suppose que vous définissez des variables @car et @consumption = @car.consumptions.build.

Essayez avec ceci:

simple_form_for @consumption, url: url_for(controller: :consumptions, action: :create, car_id: @car.id) do |f|

Cela devrait fonctionner avec simple_form_for [@car, @consumption] do |f| mais vous avez dit "cela ne fonctionne pas", ce qui est trop ambigu (comment cela ne fonctionne pas? Même erreur? Nouvelle erreur? Vous devriez être plus clair lorsque vous répondez aux réponses)

1
arieljuod 20 nov. 2018 à 19:02
 car_consumptions_path != car_consumption_path 

Je ne vois pas de "car_consumptions" dans vos itinéraires.

0
aarkerio 20 nov. 2018 à 17:20

Essaye ça:

 <%= form_for [@cars, @consumptions] do |form| %>
      ...
  <% end %>

Ou

<%= form_with(model: [ @cars, @consumptions ]) do |form| %>

*** Mise à jour:

resources :cars, shallow: true do
    resources :consumptions
end

En forme:

<% = simple_form_for [@car, @consumption] do |f| %>
1
Raf4 20 nov. 2018 à 17:51