# config/routes.rb
resources :sites do
resources :posts
end
Создает вложенных маршрутов . Запустите $ rails routes
, чтобы увидеть созданные маршруты.
Стоит ли ожидать, что пользователь отправит site_id в теле запроса?
Нет. Вложенный маршрут описывает отношения между двумя ресурсами. Это очень очевидно, если посмотреть на путь, по которому POST /sites/1/posts
создаст сообщение, принадлежащее сайту.
Было бы хорошо передать идентификатор сайта в параметрах, если вы используете неглубокое вложение и пользователь может изменить, к какому сайту относится сообщение при обновлении.
# app/controllers/posts_controller.rb
class PostsController
before_action :set_site
before_action :set_post, only: [:show, :edit, :update]
# GET /sites/1/posts/1
def show
end
# GET /sites/1/posts
def index
@posts = @site.posts
end
# GET /sites/1/posts/new
def new
@post = @site.posts.new
end
# POST /sites/1/posts
def create
@post = @site.posts.new(post_params)
if @post.save
redirect_to @post
else
render :new
end
end
# PATCH|PUT /sites/1/posts
def update
if @post.update(post_params)
redirect_to @post
else
render :edit
end
end
# GET /sites/1/posts/edit
def edit
end
private
def set_site
@site = Site.includes(:posts).find(params[:site_id])
end
def set_post
@post = @site.posts.find(params[:id])
end
def post_params
params.require(:post).permit(:title) # ...
end
end
# app/views/posts/_form.html.erb
<%= form_for [@site, @post] do |f| %>
# ...
<% end %>
# app/views/posts/new.html.erb
<%= render partial: 'form' %>
# app/views/posts/edit.html.erb
<%= render partial: 'form' %>