在控制器的下拉列表中获取所选选项的 ID
Fetch id of selected option in dropdown in controller
我有一个名为 'Assessment' 的模型:
class Assessment < ApplicationRecord
has_many :assessment_students
has_many :students, through: :assessment_students
end
加入table是:
class AssessmentStudent < ApplicationRecord
belongs_to :student
belongs_to :assessment
end
还有一个型号:
class Classroom < ApplicationRecord
has_many :classroom_students
has_many :students, through: :classroom_students
has_many :assessments
end
在显示 html.erb 个教室中,我有一个下拉列表显示所有评估(从评估 table 生成)。
代码是:
<%= collection_select(:assessment :assessment_id, Assessment.all, :id, :assessment_name , :prompt => true) %>
项目的要求是:根据用户在节目中选择的评估。html.erb 页面,我们必须显示分配给该特定评估的所有学生详细信息,例如姓名等。我已将此数据存储在 join table 'AssessmentStudent ' 中。但是,我不确定如何将 id 从上面的 collection_select 传递给教室控制器。我有以下代码:
显示。html.erb:
<%= collection_select(:assessment :assessment_id, Assessment.all, :id, :assessment_name , :prompt => true) %>
<div id="divResult">
<% @assessmentstudents1.each do |t| %>
<% t.assessment_students.each do |record| %>
<%= record.student_id %>
<% end %>
<% end %>
</div>
教室管理员:
def show
@assessmentstudents1 = Assessment.find(params[:assessment][:assessment_id]).preload(:assessment_students)
end
def classroom_params
params.require(:classroom).permit(:classroom_name, :classroom_year, :customer_id, :classroom_student, :student_ids => [])
params.require(:assessment).permit(:assessment_id)
end
标签 select
本身什么都不做。所以有两种可能的选择。
第一个是将 select
包装在 form
标记中,然后提交表单将导致请求。第二个是使用 JavaScript 编写处理程序,它将监听 select
更改。
我首先建议您更改应用程序的控制器结构。因为你ClassroomsController
的show
动作的职责应该是显示教室的详细信息。当您想显示评估的详细信息时,应该由 AssessmentsController
.
处理
首先,我假设您的 Assessment
模型具有 belongs_to :classroom
关联。那么我建议创建以下结构。
config/routes.rb
resources :classrooms
resources :assessments
app/views/classrooms/show.html.erb
<% @classroom.assessments.each do |assessment| %>
<%= link_to assessment_name, assessment_path(assessment) %>
<% end %>
app/controllers/assessments_controller.rb
class AssessmentsController < ApplicationController
def show
@assessment = Assessment.find(:id)
end
end
app/views/assessments/show.html.erb
<h1>Students for <%= @assessment.assessment_name %></h1>
<% @assessment.students.each do |student| %>
<p><%= student.student_name %></p>
<% end %>
<h2>In classroom:</h2>
<p><%= @assessment.classroom.classroom_name %></p>
所以为了解释这里发生了什么,我们配置了路由以允许服务器响应 url /assessments/:id
,这将导致调用 AssessmentsController#show
操作。
当用户单击我们在 classrooms/show
模板中设置的任何链接时,将调用该操作。请注意,我现在使用单独的链接而不是 select 下拉列表,因为它更容易设置和理解它是如何工作的。就像之前建议的答案一样,使用 select 标签需要一点 JavaScript 才能开始工作。
最后,当呈现 assessments/show
模板时,它将列出与该特定作业相关的所有学生。我还包括了它被分配到哪个教室(如果我 belongs_to 的假设是正确的)。
附带说明一下,如果你的 ruby-on-rails-3
问题标签是正确的,那么 params.permit
和 params.require
的用法是无效的,因为这是 Rails 4(除非我记错了)。在任何情况下,您只需在数据库更新发生时使用 permit
,这意味着 create
和 update
操作,而不是 index
、show
,等等,因为这是一种限制允许更改的方式。
我有一个名为 'Assessment' 的模型:
class Assessment < ApplicationRecord
has_many :assessment_students
has_many :students, through: :assessment_students
end
加入table是:
class AssessmentStudent < ApplicationRecord
belongs_to :student
belongs_to :assessment
end
还有一个型号:
class Classroom < ApplicationRecord
has_many :classroom_students
has_many :students, through: :classroom_students
has_many :assessments
end
在显示 html.erb 个教室中,我有一个下拉列表显示所有评估(从评估 table 生成)。
代码是:
<%= collection_select(:assessment :assessment_id, Assessment.all, :id, :assessment_name , :prompt => true) %>
项目的要求是:根据用户在节目中选择的评估。html.erb 页面,我们必须显示分配给该特定评估的所有学生详细信息,例如姓名等。我已将此数据存储在 join table 'AssessmentStudent ' 中。但是,我不确定如何将 id 从上面的 collection_select 传递给教室控制器。我有以下代码:
显示。html.erb:
<%= collection_select(:assessment :assessment_id, Assessment.all, :id, :assessment_name , :prompt => true) %>
<div id="divResult">
<% @assessmentstudents1.each do |t| %>
<% t.assessment_students.each do |record| %>
<%= record.student_id %>
<% end %>
<% end %>
</div>
教室管理员:
def show
@assessmentstudents1 = Assessment.find(params[:assessment][:assessment_id]).preload(:assessment_students)
end
def classroom_params
params.require(:classroom).permit(:classroom_name, :classroom_year, :customer_id, :classroom_student, :student_ids => [])
params.require(:assessment).permit(:assessment_id)
end
标签 select
本身什么都不做。所以有两种可能的选择。
第一个是将 select
包装在 form
标记中,然后提交表单将导致请求。第二个是使用 JavaScript 编写处理程序,它将监听 select
更改。
我首先建议您更改应用程序的控制器结构。因为你ClassroomsController
的show
动作的职责应该是显示教室的详细信息。当您想显示评估的详细信息时,应该由 AssessmentsController
.
首先,我假设您的 Assessment
模型具有 belongs_to :classroom
关联。那么我建议创建以下结构。
config/routes.rb
resources :classrooms
resources :assessments
app/views/classrooms/show.html.erb
<% @classroom.assessments.each do |assessment| %>
<%= link_to assessment_name, assessment_path(assessment) %>
<% end %>
app/controllers/assessments_controller.rb
class AssessmentsController < ApplicationController
def show
@assessment = Assessment.find(:id)
end
end
app/views/assessments/show.html.erb
<h1>Students for <%= @assessment.assessment_name %></h1>
<% @assessment.students.each do |student| %>
<p><%= student.student_name %></p>
<% end %>
<h2>In classroom:</h2>
<p><%= @assessment.classroom.classroom_name %></p>
所以为了解释这里发生了什么,我们配置了路由以允许服务器响应 url /assessments/:id
,这将导致调用 AssessmentsController#show
操作。
当用户单击我们在 classrooms/show
模板中设置的任何链接时,将调用该操作。请注意,我现在使用单独的链接而不是 select 下拉列表,因为它更容易设置和理解它是如何工作的。就像之前建议的答案一样,使用 select 标签需要一点 JavaScript 才能开始工作。
最后,当呈现 assessments/show
模板时,它将列出与该特定作业相关的所有学生。我还包括了它被分配到哪个教室(如果我 belongs_to 的假设是正确的)。
附带说明一下,如果你的 ruby-on-rails-3
问题标签是正确的,那么 params.permit
和 params.require
的用法是无效的,因为这是 Rails 4(除非我记错了)。在任何情况下,您只需在数据库更新发生时使用 permit
,这意味着 create
和 update
操作,而不是 index
、show
,等等,因为这是一种限制允许更改的方式。