具有多个不同ID的表单,如何保存

时间:2019-07-10 15:17:08

标签: ruby-on-rails forms

不知道如何保存具有2个ID(事件ID和用户ID)的问题表单

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

我有用脚手架生成的标准表格,但是我无法将我在Rails有限的知识和经验中缺少的东西拼凑起来,这些知识和经验涉及如何使用户提出的每个问题都链接到特定的已创建事件并显示哪个用户创建了该特定问题(我认为每个问题条目都需要一个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图片(不知道我应该只拥有用户还是应该分属创作者和用户)

ERD after reading up on last update 我开始阅读有关数据建模的更多信息,然后想到了这个ERD ...我仍然不太确定要实现3NF并建立关系,以及如何将其转换为Rails模型,但是对我的评论很高兴ERD,以便我学习。

Creator创建用户可以加入的事件。创建者创建了用户可以发布答案的问题。每个事件有很多问题,每个问题可以有很多答案。

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您需要nested resources才能实现目标。这意味着问题嵌套在事件内部,例如“父”事件具有“子”问题。首先,更改路线:

resources :events do
  resources :questions
end

在终端中运行rake routes,您将看到带有:event_id参数的新路由。现在,在events#index上,您可以在每个事件附近添加link_to 'Questions about this event', event_questions_path(event),该链接会将您引至events/1/questions(1是事件的ID)。在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,因为您从未使用过它