Форма с несколькими разными идентификаторами, как сохранить - PullRequest
0 голосов
/ 10 июля 2019

Не знаю, как сохранить форму вопроса, которая будет иметь 2 идентификатора, идентификатор события и идентификатор пользователя

User.rb

class User < ApplicationRecord
  has_many :questions
  has_many :answers
end

Event.rb

class Event < ApplicationRecord
  has_many :questions, dependent: :destroy
  accepts_nested_attributes_for :questions
end

Question.rb

class Question < ApplicationRecord
  belongs_to :user
  belongs_to :event
  has_many :answers, dependent: :destroy

  accepts_nested_attributes_for :answers
end

Answer.rb

class Answer < ApplicationRecord
  belongs_to :user
  belongs_to :question

  scope :sorted, ->{ order(created_at: :asc) }
end

questions_controller.rb

  def new
    @question = current_user.questions.build
  end

  def create
    @question = Question.new(question_params)
    @question["user_id"] = current_user.id
    respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: 'Question was successfully created.' }
        format.json { render :show, status: :created, location: @question }
      else
        format.html { render :new }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end
  end

У меня есть стандартная форма, созданная с помощью скаффолда,но я не могу собрать воедино то, что мне не хватает из моих ограниченных знаний и опыта в рельсах о том, как получить каждый вопрос, который задает пользователь, для связи с конкретным созданным событием и показать, какой пользователь создал этот конкретный вопрос (я бы предположил, что каждый вопросзапись будет нуждаться в столбце user_id и в столбце event_id)

<%= form_with(model: question, local: true) do |form| %> 
  <%= form.label :body %> 
  <%= form.rich_text_area :body %> 
  <%= form.submit 'Create Question' %> 
<% end %>

Обновлено для ошибки:

Когда я пытаюсь создать вопрос, для каждой записи требуется event_id (у события много вопросов) и user_id (я хочу показать, кто создал этот вопрос).

Правильно ли настроены мои модели и контроллеры?Когда я пытаюсь создать вопрос для события, возникает ошибка «Событие должно существовать»

Обновлен с помощью ERD pic (Не уверен, что я должен просто иметь пользователей или разделиться на создателей и пользователей)

ERD после прочтения о последнем обновлении Я начал читать больше о моделировании данных и придумал этот ERD ... Я все еще не очень уверен в достижении 3NF и настройке отношений, и какпереведите его на модели рельсов, но было бы замечательно иметь комментарии к моему ERD, чтобы я мог учиться.

Создатель создает события, к которым могут присоединиться пользователи.Создатель создает вопросы, на которые пользователи могут оставлять ответы.Каждое событие имеет много вопросов, и на каждый вопрос может быть много ответов.

1 Ответ

0 голосов
/ 15 июля 2019

Если я вас правильно понял, вам нужно вложенных ресурсов для достижения вашей цели. Это означает, что вопросы вложены в события, подобно тому, как «родительское» событие имеет «дочерние» вопросы. Сначала измените маршруты:

resources :events do
  resources :questions
end

Запустите rake routes в терминале, и вы увидите новые маршруты с параметром :event_id. Теперь к событиям # index вы можете добавить link_to 'Questions about this event', event_questions_path(event) рядом с каждым событием, ссылка приведет вас к events/1/questions (1 - это идентификатор события). В QuestionsController у вас есть новый параметр event_id, который вы можете использовать для поиска необходимого события или для назначения в качестве внешнего ключа.

Измените свою форму

<%= form_with(model: [@event, @question], local: true) do |form| %> 
  <%= form.label :body %> 
  <%= form.rich_text_area :body %> 
  <%= form.submit 'Create Question' %> 
<% end %>

и контроллер для работы с вложенными маршрутами

  def new
    @event = Event.find(params[:event_id])
    @question = event.questions.build
  end

  def create
    @event = Event.find(params[:event_id])
    @question = event.questions.build(question_params)
    @question.user_id = current_user.id

    respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: 'Question was successfully created.' }
        format.json { render :show, status: :created, location: @question }
      else
        format.html { render :new }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end
  end

Кроме того, вы должны удалить строку accepts_nested_attributes_for из моделей событий и вопросов, поскольку вы никогда не используете ее

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