在控制器的下拉列表中获取所选选项的ID

时间:2018-02-11 23:30:35

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个名为'评估':

的模型
class Assessment < ApplicationRecord
  has_many :assessment_students
  has_many :students, through: :assessment_students
end

加入表是:

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

在show,html.erb的教室中,我有一个下拉列表,显示所有评估(从评估表生成)。

代码是:

<%= collection_select(:assessment :assessment_id, Assessment.all, :id, :assessment_name , :prompt => true) %>

项目的要求是:根据用户在show.html.erb页面中选择的评估,我们必须向所有学生显示分配给该特定评估的名称等详细信息。我已将此数据存储在连接表&#39; AssessmentStudent&#39;中。但是,我不知道如何将id从上面的collection_select传递给教室控制器。我有以下代码:

show.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

2 个答案:

答案 0 :(得分:0)

标签select本身没有任何作用。所以有两种可能的选择。 第一个是将select包裹在form标记中,然后提交表单将导致请求。第二个是使用JavaScript编写处理程序,它将监听select更改。

答案 1 :(得分:0)

我首先建议您更改应用程序的控制器结构。因为show的{​​{1}}操作的责任应该是显示课堂的详细信息。当您想要显示评估的详细信息时,应由ClassroomsController处理。

首先,我假设你的AssessmentsController模型有一个Assessment关联。然后我建议创建以下结构。

配置/ routes.rb中

belongs_to :classroom

应用程序/视图/教室/ show.html.erb

resources :classrooms
resources :assessments

应用程序/控制器/ assessments_controller.rb

<% @classroom.assessments.each do |assessment| %>
  <%= link_to assessment_name, assessment_path(assessment) %>
<% end %>

应用程序/视图/评估/ show.html.erb

class AssessmentsController < ApplicationController

  def show
    @assessment = Assessment.find(:id)
  end

end

因此,为了解释此处发生的情况,我们已配置路由以允许服务器响应将导致<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> 操作被调用的网址/assessments/:id

当用户点击我们在AssessmentsController#show模板中设置的任何链接时,系统会调用该操作。请注意,我现在使用单独的链接而不是选择下拉列表,因为它更容易设置和理解它的工作原理。和之前的回答一样,使用select标签需要一些JavaScript才能正常工作。

最后,当呈现classrooms/show模板时,它会列出与该特定任务相关的所有学生。而且我还包括分配到哪个教室(如果我对belongs_to的假设是正确的话)。

在旁注中,如果您的assessments/show问号是正确的,则ruby-on-rails-3params.permit的使用无效,因为这是Rails 4中引入的内容(除非我弄错了。)在任何情况下,您只需在发生数据库更新时使用params.require,这意味着permitcreate操作,而不是updateindex,等等,因为它是一种限制允许更改的方式。