Рельсы способ сделать это путем создания вложенного ресурса :
# config/routes.rb
resources :series do
resources :episodes, shallow: true
end
Выполнить rails routes
, чтобы увидеть выходные данные маршрутов. Ключевым моментом здесь является то, что он создает маршрут GET /series/:series_id/episodes/new
и POST /series/:series_id/episodes
. Это делает связь между двумя ресурсами явной, а не скрытой в теле запроса.
В общем случае, если вы используете скрытое поле для передачи идентификатора ресурса или идентификатора пользователя, которым вы являетесьделает это неправильно.
class EpisodesController
before_action :set_series
# GET /series/1/episodes/new
def new
@episode = @series.episodes.new
end
# POST /series/1/episodes
def create
@episode = @series.episodes.new(episode_params)
if @episode.save
redirect_to @episode
else
render :new
end
end
# ...
private
def set_series
@series = Series.find(params[:series_id])
end
def episode_params
params.require(:episode).permit(:foo, :bar, :baz)
end
end
Чтобы получить форму для отправки на /series/:serie_id/episodes
вместо /series
, мы передаем массив:
<%= form_for([@series, @episode]) %>
<%= f.label :name, 'Name' %>
<%= f.text_field :name%>
<%= f.submit %>
<% end %>
Если пользователь нажимаеткнопка, которая присваивает форму из нового для создания, если он делает ошибку при заполнении формы, @episode не может быть сохранен и выполняет рендеринг: новый, а затем URL-адрес меняется на localhost3000 / episodes /
Это действительно распространенное зависание новичка, вызванное непониманием того, как стиль Rails REST работает
В REST вы создаете ресурс, публикуя его на маршруте сбора (POST /episodes
). Это означает, что URL-адрес браузера изменяется путем публикации формы, и именно так и должно быть.
render :new
НЕ меняет URL-адрес. Он просто инструктирует рельсы для рендеринга вида app / views / episodes / new.html.erb .
То, что вы затем видите, является результатом выполнения неидемпотентного действия. Вы НЕ ДОЛЖНЫ перенаправлять назад, так как они оба не нужны и требуют, чтобы вы поместили все параметры в строку запроса, что не идеально.
PS
Вы также должны заметить, что правильноформа единственного числа на английском языке - серия не серия . Не уверен, что рельсы будут правильно перегибать это, но если нет, вы можете сделать это, настроив перегиб.
# config/intializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.irregular 'series', 'series'
en
Затем следует переименовать модель и ассоциации.
Почему это важно? Принцип наименьшего удивления.