不知道如何保存具有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创建用户可以加入的事件。创建者创建了用户可以发布答案的问题。每个事件有很多问题,每个问题可以有很多答案。
答案 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
,因为您从未使用过它