Closed tangmaomao16 closed 7 years ago
你试试把
<span class="label label-info pull-right"><%= @num_oppenarray %></span>
替换为:
<span class="label label-info pull-right"><%= @openarray.length%></span>
只要这个局部视图在加载,那么一定会动态计算@openarray.length
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
这个留言框怎么能加入图片进来?我试过粘贴截图,但是preview中是一行英文。
截图然后粘贴过来就行,preview可能有点慢?
用你的@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网页结果如截图
表明,@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 %>
请问,有这样的代码语句吗?
有啊,你可以直接在视图文件中插入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>
其实我的原意是<% if student_logged_in? %>
当学生登录后,去调用执行list_courses_path中的代码,但是网站的页面或者说URL,不是link_to list_courses_path的那种,而仍然是<% if student_logged_in? %>
当学生登录后的第一个页面。有没有这么一种调用的语句?
你这次给出的方案,在两个文件中出现了高度一致、几乎重复的代码段,在有“Don't Repeat Yourself”愿景的Ruby on rail里,是否有我想要的那种调用语句?
你说的意思是,不需要link_to点击按钮就去执行list代码,有点困难,因为我还没接触到这么用的。。。
好的。先睡吧。我明早还有考试。 我就天真地那么一想。实在没有的话,老师你以后有空,可以去改进一下Ruby on Rails的体系,出一个RoR+.
老师,我想解决这个问题能不能像引入新的字段open一样,引入一个integer字段opend_courses,这样,它也是全局变量,然后在计数的那里就用这个变量来实现?
ruby中的全局变量是两个@@号,如 @@opencourse,你可以尝试在控制器里用定义一个全局变量,看在视图里能否获得
老师,我按你说的在控制器中定义了全局变量@@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>
然后报错,求指导!
这个问题应该是定义的全局变量@@open_num只能在控制器里使用,视图文件是没有加载这个变量的。我也不知道咋解决。。。
最简单的方法:
<span class="label label-info pull-right"><%= Course.where(open: true)-current_user.courses %> </span>
在编辑的过程中,看到了老师的回复。哈哈。问一个关于这个编辑的问题把,试了半天,没研究明白。这个write和preview的效果不一样,用了一下上面的insert等工具也没弄对。。。。担心老师看代码的时候不方便。。。
当开放课程为0的时候是正确的 当开放一个课程的时候就出了问题 出现了代码串似得东西。。。
<span class="label label-info pull-right"><%= (Course.where(open: true)-current_user.courses).length %> </span>
谢谢老师,不过我还是想追问一下,为什么第一次会返回一个关于运行时间的信息?
Course.where(open: true)-current_user.courses
返回的是满足要求的课程对象的集合,课程对象里封装的有更新时间等字段,用length对这些集合进行count
get it! thx!!!
Course.where(open: true)
这句话真的很像人类语言!
另外问一句,current_user
这个变量是作者自己定义的,还是ruby on rails 体系里可以自动生成以及辨识的?
这个方法是定义在app/helper/SessionsHelper
里,这种Helper定义的方法既能在控制器里使用,又可以在视图中使用,目的就是为了减少在视图中插入ruby代码的尴尬
![Uploading image.png…]()
我在view/shared/目录下,找到_sidenav.html.erb文件
将其中的代码修改为:
其中
@num_oppenarray
来源于我改写的course_controller.rb文件中的如下代码:但是run网页时,只有在点击“开放课程“按钮后,开放课程的数量才会更新。 而我想要的结果是,只要进了”我的课程“页面,开放课程的数量就已经显示为更新过的数量。
原作者的_sidenav.html.erb文件中的代码如下:
我感觉到,我代码中的@openarray,@num_oppenarray是def list中的变量,属于局部变量,只有当link_to list_course_path时,才会执行def list中的代码。
所以,我想问,怎样将openarray定义成一个全局的东西(我不是指$openarray全局变量)?这样,我直接写openarray.length, 就能获得开放课程的数量