生成选定用户列表的辅助方法

Helper method to produce list of selected users

我是初学者,正在尝试与我的 rails 应用程序中的注册相关的一些方面。用户有很多注册;注册属于一节课;注册有很多 word_expositions 和 scrambled_words.

我在课程控制器中编写了一个辅助方法来生成已注册用户的列表,以显示在每个课程显示页面中:

helper_method :enrolled_users
  def enrolled_users
    lesson = Lesson.find(params[:id])
    enrollments = lesson.enrollments
    enrolled_users = enrollments.map { |enrollment| enrollment.user }
  end

我现在正在尝试实现一个 completed_expos 帮助程序,以便我可以在每个用户旁边指示他们是否已完成我的应用程序的说明组件。我有的是:

helper_method :completed_expos
  def completed_expos
    lesson = Lesson.find(params[:id])
    completed_expos = enrolled_users.map do |user|
      current_enrollment = lesson.enrollment_for(user)
      all_expos = current_enrollment.word_expositions
      all_expos.all? { |expos| expos.completed == true }
    end
  end

我想在每个列出的用户旁边添加一条通知,说明他们是否完成了博览会。所以我尝试的是:

<% enrolled_users.each do |user| %>
  <ul>
    <li><%= user.username %></li>

    <% if completed_expos.include?(user)  %>
      completed
    <% end %>
  </ul>
<% end %>

但结果是,虽然列出了已注册的用户,但在应该列出的地方没有关于 expo 完成的指示。我该如何选择这部分用户?

问题是助手没有返回用户,将其映射到数组中:

helper_method :completed_expos
def completed_expos
  lesson = Lesson.find(params[:id])
  completed_expos = enrolled_users.map do |user|
    current_enrollment = lesson.enrollment_for(user)
    all_expos = current_enrollment.word_expositions
    user if all_expos.all? { |expos| expos.completed == true }
  end
end

从你的代码中我可以得到的是你的 "completed_expos" 方法总是 return 一个布尔值数组(真,假)而不是用户列表,所以它永远不会包括您指定的用户。

我想您可能想要使用 select 而不是地图。

enrolled_users.select do |user|
  current_enrollment = lesson.enrollment_for(user)
  all_expos = current_enrollment.word_expositions
  all_expos.all? { |expos| expos.completed == true }
end

另外,我要说的是,您不需要将每个方法中的值分配给与该方法同名的变量。例如。

def enrolled_users
  lesson = Lesson.find(params[:id])
  enrollments = lesson.enrollments
  enrolled_users = enrollments.map { |enrollment| enrollment.user }
end

可能是

def enrolled_users
  lesson = Lesson.find(params[:id])
  enrollments = lesson.enrollments
  enrollments.map { |enrollment| enrollment.user }
end