Как мне обновить ресурс, который полностью зависит от другого ресурса - PullRequest
0 голосов
/ 12 ноября 2019

Допустим, у меня есть эти две модели:

class Post < ApplicationRecord
  belongs_to :site
end

class Site < ApplicationRecord
  has_many :posts
end

Чтобы создать сообщение, мне нужно знать идентификатор сайта. Прямо сейчас у меня есть маршрут, который указывает на PostsController#create:

post 'posts', to: 'posts#update'

Стоит ли ожидать, что пользователь отправит site_id в теле запроса?

Ответы [ 2 ]

1 голос
/ 12 ноября 2019
# 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' %>
0 голосов
/ 12 ноября 2019

Когда вы добавляете в свои ресурсы маршрута: сообщения, которые создают автоматические маршруты для индексации, показа, создания, обновления и удаления. post 'posts' должен указывать на 'posts # create'. поставить «сообщения» указывает на «сообщения # обновления».

И да, отправьте site_id в теле запроса

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