【发布时间】:2019-02-04 00:24:19
【问题描述】:
我正在建立一个用户可以创建项目的网站。每个项目包含几篇论文。每篇论文都可以通过回答几个问题来进行审核。
我有四个模型(用户、项目、论文、问题)。
在questions_controller 中,我创建了一个动作replies,目的是选择具有特定project_id 和paper_id 的所有回复。
在对象@replies中,我想选择所有在URL中显示project_id和paper_id的论文和项目。
http://0.0.0.0:3000/projects/3/papers/2/questions/1/replies
我想选择所有带有project_id == 3 和paper_id == 2 的回复
为此,我编写了以下代码:
questions_controller.rb
def replies
@project = Project.find(params[:project_id])
@paper = Paper.find(params[:paper_id])
@replies = Question.where("project_id = ? AND paper_id = ?", params[:project_id], params[:paper_id])
end
并通过@replies in:
views/questions/replies.html.erb
<% @replies.each do |reply| %>
<%= reply %>
<% end %>
但是,它不起作用。事实上,我在@replies 中的查询并没有在我的views/questions/replies.html.erb 中传递任何内容。
我不确定我做错了什么。
routes.rb
Rails.application.routes.draw do
resources :projects do
resources :papers do
resources :questions do
collection do
get 'replies'
end
end
end
end
devise_for :users
root to: 'pages#home'
project.rb
class Project < ApplicationRecord
belongs_to :user
has_many :papers, dependent: :destroy
has_many :questions
end
paper.rb
class Paper < ApplicationRecord
belongs_to :project
has_many :questions
has_one_attached :paper_pdf
end
question.rb
class Question < ApplicationRecord
belongs_to :user
belongs_to :paper
belongs_to :project
end
user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :projects
has_many :questions
end
【问题讨论】:
-
你没有说真正的问题。除了
raise之外,你还有什么错误吗?如果您没有错误,则问题与代码无关。您实际上是否将questions存储在论文 2 的数据库中? ...请详细说明。 -
显示您的模型,显示实际错误。此外,不鼓励使用超过 2 级的嵌套资源,您肯定有办法简化您的路线。我猜你需要加入表格来做这些查询,阅读关于 activerecord 的
joins、includes和references。 -
按照您当前设置路线的方式,您还需要在路径中有一个 question_id。但是我认为您实际上并不想要问题ID。您将路线更改为这样的东西,也许它会开箱即用:
resources :questions do collection do get 'replies' end end---不要忘记确保问题正确嵌套在项目和论文资源中,最后,我建议使用浅嵌套。 -
@BKSpureon 我认为你是对的。我不需要在
question_id之后有replies。我想我需要像/papers/1/questions/replies这样的它,因为我需要针对特定论文的所有回复(问题的)。我按照您的建议修复了路线,但我仍然卡住了。在我的 questions_controller 中,我添加了一个动作replies和@replies = Question.where("project_id = ? AND paper_id = ?", params[:project_id], params[:paper_id]),但它仍然无法找到 @replies。所以我想我的查询是错误的。 -
@Maxence @arieljuod 我添加了您在我的问题中提出的信息,并使其更加清晰。我的问题是我的 question_controller 中
@replies的查询没有检索到任何内容。我想检索(特定项目中特定论文的所有已回答问题)。创建问题是因为我通过rails console --> Question.allverigy 它存在正确的project_id和paper_id参数,
标签: sql ruby-on-rails activerecord