PENGZhaoqing / CourseSelect

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

找出已“开课”的所有课程——代码运行结果不符合预期设计 #44

Closed tangmaomao16 closed 7 years ago

tangmaomao16 commented 7 years ago

我的代码如下: def list @course=Course.all @course= @course-current_user.courses

@openarray = {} @course.each do |course| if course.open? @openarray.push(course) end end

return @openarray end

run网页,运行结果是原本的所有的“除当前已选的课程以外的课程”,不是预期设计的“只有已开课的课程”。

PENGZhaoqing commented 7 years ago

image

选中代码,然后点击insert code,就能达到那种效果

PENGZhaoqing commented 7 years ago

把你的list方法对应的视图代码贴出来

tangmaomao16 commented 7 years ago

我找到view中的list.html.erb文件 里面有这样的一句代码: <% @course.each do |course| %>

而我的course_controller文件中,用的是@openarray来储存已开课的课程。这解释了,我之前run网页时,运行结果仍然是原本的所有的“除当前已选的课程以外的课程”,即@course= @course-current_user.courses, 而非我想要的@openarray

后来将list.html.erb文件中的 <% @course.each do |course| %> 改写为 <% @openarray.each do |course| %> run网页, 显示错误,说是与“@openarray是hash"有关,因为我定义@openarray的语句是@openarray = {},这就把@openarray定义成了hash;另一方面,像@openarray.push(course)这样的语句,push方法只能在数组上使用,而不能在hash上使用,综上,造成了错误。 我的解决方案是,改用@openarray = Array.new, 这样就把@openarray 定义成数组,可以使用push方法了。用push方法加入新元素到数组中是一种非常简洁的代码!

此外,怀着”简洁用语“的理想,我删去了return @openarray,将if短句后置以省去end,以及将if短句中的问好去掉。

最终,代码如下:

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

    @openarray = Array.new
    @course.each do |course| 
            @openarray.push(course) if course.open
    end

  end

run网页时,终于符合预期设计了。 感谢老师!

PENGZhaoqing commented 7 years ago

哈哈哈哈,不错不错,自己解决了问题,还理解了rails的简介的精髓

其实声明一个新数组还有更简洁的写法 : ) @openarray = []