ActionController :: RoutingError (Маршрут не соответствует [POST] "/ cars / 1 / consumptions / new"): - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть эта ошибка маршрутизации, когда я добавляю потребление (после отправки, оно терпит неудачу), и я застреваю, Что я делаю не так?

У пользователя может быть несколько машин, и для каждой своей машины он хочетчтобы следить за его расходом газа.

У меня есть три активные модели записи

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
  • автомобиль belongs_to :users и has_many :consumptions
  • пользователь has_many :carshas_many :consumptions through: :cars
  • потребление belong_to :car и belongs_to :user

Мой метод создания в 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

просмотров / потребления / _form.html.erb

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

rout.rb

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

    resources :cars do
        resources :consumptions
    end
end

рельсовые маршруты |потребление 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

в соответствии с запросом enter image description here

EDIT

вот что я имею в HTML, если это может помочь:

<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==">

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Давайте начнем с контроллера

# 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

Обратите внимание на перенаправление:

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

Поскольку это вложенный маршрут, вам необходимо указать сегмент car_id.

Вы также можете перенаправить на:

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

При использовании simple_form_for вы передаете ему экземпляры модели, с которыми он связывает форму.При создании форм для вложенных маршрутов вы должны передать массив:

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

<% end %>

При этом используются помощники полиморфного маршрута , чтобы найти правильный путь.Вы можете использовать эту же подпись для link_to, redirect_to, url_for и path_for.

При объявлении вложенных маршрутов следует учитывать с использованием опции shallow .Он будет вкладывать только маршруты коллекций (новые, создавать, индексировать), а не маршруты участников.

0 голосов
/ 20 ноября 2018

Попробуйте:

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

или

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

*** Обновление:

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

В форму:

<% = simple_form_for [@car, @consumption] do |f| %>
0 голосов
/ 20 ноября 2018

Вы не показываете свое действие new, но я предполагаю, что вы устанавливаете переменные @car и @consumption = @car.consumptions.build.

Попробуйте с этим:

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

Этодолжен работать с simple_form_for [@car, @consumption] do |f|, но вы сказали, что «это не работает», что слишком двусмысленно (как это не работает? та же ошибка? новая ошибка? вы должны быть более ясными, отвечая на ответы)

0 голосов
/ 20 ноября 2018
 car_consumptions_path != car_consumption_path 

Я не вижу никаких "car_consumptions" в ваших маршрутах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...