在控制器的下拉列表中获取所选选项的 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 更改。

我首先建议您更改应用程序的控制器结构。因为你ClassroomsControllershow动作的职责应该是显示教室的详细信息。当您想显示评估的详细信息时,应该由 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.permitparams.require 的用法是无效的,因为这是 Rails 4(除非我记错了)。在任何情况下,您只需在数据库更新发生时使用 permit,这意味着 createupdate 操作,而不是 indexshow,等等,因为这是一种限制允许更改的方式。