Rails: какой маршрут разрешить отображать один ресурс, но передавать другому? [closed]

Я набрасываю модель данных для приложения Rails, которое позволяет пользователям отправлять ответы на технические вопросы. Например, приглашение может быть таким:

Напишите SQL-запрос, чтобы определить количество уникальных посетителей на прошлой неделе.

Мои модели будут выглядеть так:

class User < ApplicationRecord
  has_many :submissions
end

class Submission < ApplicationRecord
  belongs_to :user
  belongs_to :question
end

class Question < ApplicationRecord
  has_many :submissions
end

Я бы хотел, чтобы пользователь мог посетить страницу, на которой будут отображаться:

  1. Подсказка вопроса
  2. Предыдущие ответы пользователя на этот вопрос
  3. Форма, позволяющая пользователю создать новую отправку для этого вопроса.

Как мне настроить маршруты с учетом этих требований? Я немного потерялся, но думаю, что мог бы использовать вложенные ресурсы в своем routes.rb:

# not sure order matters here; I've usually seen nested routes be 
# ordered by the has many relationship.  so if A has many B and B has 
# many C, then the nesting order is A, B, C.

resources :questions do  
  resources :users do
    resources :submissions
  end
end

Если бы я сделал это, конкретный пользователь, отправивший ответ на конкретный вопрос, мог бы быть:

POST to /questions/:question_id/users/:user_id/submissions

Тогда действие create моего контроллера могло бы выглядеть так:

class SubmissionController < ApplicationController
  def create
    @question = Question.find(params[:question_id])
    @user = User.find(params[:user_id])
    Submission.create(params[:submission], user: current_user, question: @question)
    @submissions = Submission.where(user: @user, question: @question)
   
    redirect_to [@question, @user]
  end
end 

Есть ли более RESTful / Rails-ey способ сделать это? Если нет, имеет ли значение порядок моих вложенных маршрутов? Заранее благодарим за любую помощь, которую вы можете предложить!

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *