PENGZhaoqing / CourseSelect

校园选课系统样本 (a template for course selection system by Ruby on Rails)
https://courseselect.herokuapp.com/
MIT License
105 stars 205 forks source link

想把”我的课程“页面中左侧的”选修课程”数量更新为“开放课程”的数量 #46

Closed tangmaomao16 closed 7 years ago

tangmaomao16 commented 8 years ago

![Uploading image.png…]()

我在view/shared/目录下,找到_sidenav.html.erb文件

将其中的代码修改为:

        <% if student_logged_in? %>
            <li class="list-group-item">
              <%= link_to list_courses_path do %>
                  <span class="glyphicon glyphicon-chevron-right"></span> 开放课程
                  <span class="label label-info pull-right"><%= @num_oppenarray %></span>
              <% end %>

其中@num_oppenarray来源于我改写的course_controller.rb文件中的如下代码:

 def list
    @course=Course.all
    @course= @course-current_user.courses

    @openarray = []
    @course.each do |course| 
            @openarray.push(course) if course.open
    end

    @num_oppenarray=@openarray.length

  end

但是run网页时,只有在点击“开放课程“按钮后,开放课程的数量才会更新。 而我想要的结果是,只要进了”我的课程“页面,开放课程的数量就已经显示为更新过的数量。

原作者的_sidenav.html.erb文件中的代码如下:

 <% if student_logged_in? %>
            <li class="list-group-item">
              <%= link_to list_courses_path do %>
                  <span class="glyphicon glyphicon-chevron-right"></span> 选修课程
                  <span class="label label-info pull-right"><%= (Course.all-current_user.courses).length %></span>
              <% end %>
            </li>
            <li class="list-group-item">
              <%= link_to courses_path do %>
                  <span class="glyphicon glyphicon-chevron-right"></span> 已选课程
                  <span class="label label-info pull-right"><%= current_user.courses.length %></span>
              <% end %>
            </li>
        <% end %>

我感觉到,我代码中的@openarray,@num_oppenarray是def list中的变量,属于局部变量,只有当link_to list_course_path时,才会执行def list中的代码。

所以,我想问,怎样将openarray定义成一个全局的东西(我不是指$openarray全局变量)?这样,我直接写openarray.length, 就能获得开放课程的数量

PENGZhaoqing commented 8 years ago

你试试把 <span class="label label-info pull-right"><%= @num_oppenarray %></span> 替换为: <span class="label label-info pull-right"><%= @openarray.length%></span>

只要这个局部视图在加载,那么一定会动态计算@openarray.length

PENGZhaoqing commented 8 years ago
def list
   @course=Course.all
   @course= @course-current_user.courses

  #临时变量
   openarray = []
   @course.each do |course| 
           openarray.push(course) if course.open
   end

  #返回给@course,无论在哪个视图中都能用@course表示最新的结果
   @course=openarray
 end
tangmaomao16 commented 7 years ago

这个留言框怎么能加入图片进来?我试过粘贴截图,但是preview中是一行英文。

PENGZhaoqing commented 7 years ago

截图然后粘贴过来就行,preview可能有点慢?

tangmaomao16 commented 7 years ago

用你的@course=openarray方案

def list
   @course=Course.all
   @course= @course-current_user.courses

  #临时变量
   openarray = []
   @course.each do |course| 
           openarray.push(course) if course.open
   end

  #返回给@course,无论在哪个视图中都能用@course表示最新的结果
   @course=openarray
 end

<span class="label label-info pull-right"><%= @course.length%></span>

run网页结果如截图 image

表明,@course等价于current_user.courses,即在没有点击按钮的时候,没有执行list中的代码,所以没有openarray的生成。

我想在_sidenav.html文件中

        <% if student_logged_in? %>
            <li class="list-group-item">
              <%= link_to list_courses_path do %>
                  <span class="glyphicon glyphicon-chevron-right"></span> 开放课程
                  <span class="label label-info pull-right"><%= @num_oppenarray %></span>
              <% end %>
            </li>
            <li class="list-group-item">
              <%= link_to courses_path do %>
                  <span class="glyphicon glyphicon-chevron-right"></span> 已选课程
                  <span class="label label-info pull-right"><%= current_user.courses.length %></span>
              <% end %>

做改动。

想法是:在<% if student_logged_in? %>后,紧接着来一句list_courses_path,不需要link_to点击按钮去执行list代码,这样就先生成了@num_oppenarray这个变量;然后接着写上原文中的代码

<li class="list-group-item">
              <%= link_to list_courses_path do %>
                  <span class="glyphicon glyphicon-chevron-right"></span> 开放课程
                  <span class="label label-info pull-right"><%= @num_oppenarray %></span>
              <% end %>

请问,有这样的代码语句吗?

PENGZhaoqing commented 7 years ago

有啊,你可以直接在视图文件中插入ruby代码,用<%%>括起来

<%
   courses=Course.all-current_user.courses
   openarray=[]
   courses.each do |course| 
           openarray.push(course) if course.open
   end
%>

<span class="label label-info pull-right"><%= openarray.length%></span>
tangmaomao16 commented 7 years ago

其实我的原意是<% if student_logged_in? %>当学生登录后,去调用执行list_courses_path中的代码,但是网站的页面或者说URL,不是link_to list_courses_path的那种,而仍然是<% if student_logged_in? %>当学生登录后的第一个页面。有没有这么一种调用的语句? 你这次给出的方案,在两个文件中出现了高度一致、几乎重复的代码段,在有“Don't Repeat Yourself”愿景的Ruby on rail里,是否有我想要的那种调用语句?

PENGZhaoqing commented 7 years ago

你说的意思是,不需要link_to点击按钮就去执行list代码,有点困难,因为我还没接触到这么用的。。。

tangmaomao16 commented 7 years ago

好的。先睡吧。我明早还有考试。 我就天真地那么一想。实在没有的话,老师你以后有空,可以去改进一下Ruby on Rails的体系,出一个RoR+.

cuifeng1993 commented 7 years ago

老师,我想解决这个问题能不能像引入新的字段open一样,引入一个integer字段opend_courses,这样,它也是全局变量,然后在计数的那里就用这个变量来实现?

PENGZhaoqing commented 7 years ago

ruby中的全局变量是两个@@号,如 @@opencourse,你可以尝试在控制器里用定义一个全局变量,看在视图里能否获得

cuifeng1993 commented 7 years ago

老师,我按你说的在控制器中定义了全局变量@@open_num,代码如下:

def list
    @course=Course.all
    @course=@course-current_user.courses
    @course_open=Array.new
    @course.each do |every_course|
      if every_course.open then 
        @course_open.push every_course
      end
    end
    @@open_num=@course_open.length
    @course=@course_open
  end

视图中的代码如下:

<span class="glyphicon glyphicon-chevron-right"></span> 开放课程
<span class="label label-info pull-right"><%= @@open_num %>   </span>

然后报错,求指导! image

PENGZhaoqing commented 7 years ago

这个问题应该是定义的全局变量@@open_num只能在控制器里使用,视图文件是没有加载这个变量的。我也不知道咋解决。。。

最简单的方法: <span class="label label-info pull-right"><%= Course.where(open: true)-current_user.courses %> </span>

cuifeng1993 commented 7 years ago

在编辑的过程中,看到了老师的回复。哈哈。问一个关于这个编辑的问题把,试了半天,没研究明白。这个write和preview的效果不一样,用了一下上面的insert等工具也没弄对。。。。担心老师看代码的时候不方便。。。 image image

cuifeng1993 commented 7 years ago

当开放课程为0的时候是正确的 image 当开放一个课程的时候就出了问题 image 出现了代码串似得东西。。。

PENGZhaoqing commented 7 years ago

<span class="label label-info pull-right"><%= (Course.where(open: true)-current_user.courses).length %> </span>

cuifeng1993 commented 7 years ago

谢谢老师,不过我还是想追问一下,为什么第一次会返回一个关于运行时间的信息?

PENGZhaoqing commented 7 years ago

Course.where(open: true)-current_user.courses返回的是满足要求的课程对象的集合,课程对象里封装的有更新时间等字段,用length对这些集合进行count

cuifeng1993 commented 7 years ago

get it! thx!!!

tangmaomao16 commented 7 years ago

Course.where(open: true)这句话真的很像人类语言!

另外问一句,current_user这个变量是作者自己定义的,还是ruby on rails 体系里可以自动生成以及辨识的?

PENGZhaoqing commented 7 years ago

这个方法是定义在app/helper/SessionsHelper里,这种Helper定义的方法既能在控制器里使用,又可以在视图中使用,目的就是为了减少在视图中插入ruby代码的尴尬