【问题标题】:Helper method to produce list of selected users生成选定用户列表的辅助方法
【发布时间】:2016-08-01 23:42:47
【问题描述】:

我是一名初学者,正在尝试与我的 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 %>

但效果是,虽然列出了已注册的用户,但在应该列出它的那些地方没有关于博览会完成的迹象。我该如何选择这个用户子组?

【问题讨论】:

    标签: ruby-on-rails controller helper


    【解决方案1】:

    我从您的代码中得到的是,您的“completed_expos”方法将始终返回一个布尔值数组(true、false)而不是用户列表,因此它永远不会包含您指定的用户。

    我猜你可能想做的是使用 select 而不是 map。

    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
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多