= 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