Не найдено ни одного маршрута [POST] "/ downtowns / 1 / properties / new" - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть приложение, которое имеет отношение один ко многим с центрами городов и свойствами. То, с чем у меня были проблемы, - это создание новых свойств в Даунтауне. Я продолжаю получать сообщение об ошибке, которое я использовал в качестве заголовка для этого вопроса.

У меня есть догадка, что проблема в моей форме (я использую простой камень формы). Я могу go перейти на мою страницу new, заполнить форму, а затем, когда я нажимаю "Отправить", я получаю эту ошибку.

Сначала я покажу свой файл формы. (У меня были проблемы с пониманием документов простой формы, и именно поэтому я думаю, что именно в этом проблема)

= simple_form_for (@property), method: 'POST', url: new_downtown_property_path do |f|
  = f.input :name
  = f.input :last_remodel
  = f.input :original_construction_year

Файл моих маршрутов

resources :downtowns do
  resources :properties
end

Мой контроллер в центре города

def show
    @properties = Property.where(downtown: @downtown_id)
  end

  def new
    @downtown = Downtown.new
  end

  def create
    @downtown = Downtown.create(downtown_params)
    if @downtown.save
      redirect_to @downtown
    else
      render 'new'
    end
  end

  def downtown_params
    params.require(:downtown).permit(:name, :city)
  end

и мой контроллер свойств

  def new
    @property = Property.new
  end

  def create
    @downtown = property.find(id)
    @property = Property.create(params[:property_params])
    @property.downtown_id = @downtown.id

    if @property.save
      redirect_to @property
    else
      render 'new'
    end
  end

  def show
  end

Ответы [ 3 ]

1 голос
/ 14 февраля 2020
= simple_form_for([@downtown, @property]) do |f|
  = f.input :name
  = f.input :last_remodel
  = f.input :original_construction_year

Просто передайте массив для поиска вложенного маршрута с помощью помощников маршрута polymorphi c. Это будет правильно использовать downtown_properties_path в качестве действия. В Rails вы всегда создаете ресурсы, публикуя путь к коллекции (/downtowns/1/properties). Новый маршрут просто отображает форму. Вам не нужно указывать метод, поскольку Rails обнаруживает, сохранилась ли модель, и соответственно устанавливает метод в POST или PATCH.

Вы также никогда не должны добавлять пробел между именем метода и паренями, окружающими список аргументов, в Ruby:

def add(a,b)
  a + b
end

add (1, 2) # syntax error
add (1), 2 # this is what actually happens 

Ruby ведет себя совсем иначе, чем, например, JS здесь, так как паренсы необязательны для вызовов методов.

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

class PropertiesController < ApplicationController
  before_action :set_downtown
  before_action :set_property, only: [:show, :edit, :update, :destroy]

  # GET /downtowns/1/properties/new
  def new
    @property = @downtown.properties.new
  end

  # POST /downtowns/1/properties
  def create
    @property = @downtown.properties.new(property_params)
    if @property.save
      redirect_to @property 
    else
      render :new
    end
  end

  # ...

  private

  def set_downtown
    @downtown = Downtown.includes(:properties).find(params[:downtown_id])
  end

  def set_propery
    @property = Property.find(params[:id])
  end

  def property_params
    params.require(:downtown)
          .permit(:name, :city)
  end

  # ...
end
0 голосов
/ 14 февраля 2020

"/ downtowns / 1 / properties / new" - это определение маршрута, когда вы визуализируете шаблон для создания записи, а вместо этого используется глагол GET.

В форме вам нужен путь URL, который маршрутизирует для обработки действия POST, а действие должно обрабатывать его, я думаю, что это «properties # create», и если вы хотите использовать URL, то правильный URL-адрес - «downtown_properties_path». Вы можете запустить команду "rails routs", чтобы получить подробности.

0 голосов
/ 14 февраля 2020

Вы хотите отправить на downtown_property_path, а не на new_downtown_property_path.

Подробнее читайте здесь https://guides.rubyonrails.org/routing.html

...