PENGZhaoqing / CourseSelect

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

添加筛选课程功能的几个疑问 #57

Closed 5663015 closed 7 years ago

5663015 commented 7 years ago

界面大致如下: image 拿“学时/学分”选项和按钮代码示例:

<label for="name">学时/学分</label>
<select class="form-control" , style="width:150px">
      <option value ="1">60/3.0</option>
      <option value ="2">40/2.0</option>
</select>
    <td><% @course.credit = "60/3.0" %></td>

&nbsp
<%=link_to "筛选", filter_course_url(@course),class: 'btn btn-xs btn-info' %>
&nbsp
<%=link_to "刷新", refresh_course_url(@course),class: 'btn btn-xs btn-info' %>

实际上只要加入<% @course.credit = "60/3.0" %>这句就会出现下面错误: image 我的疑问是如何将选好的筛选条件赋给course变量的credit、course_type等属性,并在控制器中根据这些属性将符合条件的课程筛选出来?另外刷新页面功能有什么思路吗,查了一下都是用JS实现的。谢谢~

PENGZhaoqing commented 7 years ago

大致明白你的意思了,你的那些筛选内容应该用form_for构造成表单,点击筛选按钮,提交表单到rails里的course控制中list方法(或者index),在这个方法里取出提交的信息,用where方法在Course类里筛选出来,将筛选的结果传回list方法的视图,这个时候列举出来的课程都是筛选过的

PENGZhaoqing commented 7 years ago

就跟点击开课按钮后,能看到所有的开课课程一样,这里点击后,还传入了其他参数,经过rails的处理返回了符合要求的所有课程

5663015 commented 7 years ago

刚才插入代码有点问题,现在看到的代码应该是form_for构造表单吧

5663015 commented 7 years ago

还有,我看网上教程里,比如这句 < option value="">默认选择< /option>,value的作用是什么?

PENGZhaoqing commented 7 years ago

<option value ="2">40/2.0</option>

如果你选了40/2.0这个选项,提交后的值为2

5663015 commented 7 years ago

哦哦,那怎么把选择的40/2.0这个选项赋给course的credit呢?

PENGZhaoqing commented 7 years ago

用select方法

<%= form_for @user, html: {class: 'form-horizontal', role: 'form'} do |f| %>

    ....

        <%= f.label :role, class: 'col-sm-3 control-label' %>
        <div class="col-sm-8">
          <%= f.select :role, options_for_select(['undergraduate', 'master', 'doctor', 'lecturer', 'associate professor', 'professor', 'executive staff']), {}, class: 'form-control' %>
        </div>

    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-9">
        <%= f.submit class: "btn btn-success" %>
        <%= link_to "Cancel", @user.new_record? ? root_path : user_path(@user), :class => "btn btn-default" %>
      </div>
    </div>

<% end %>

role是user的一个字段,在这里你应该填:credit,后面的就是各种选项了,提交后的值就是选择的值

5663015 commented 7 years ago

我现在是做到这种程度了: 视图:

`< %= select_tag "credit", options_for_select([['40/2.0', '40/2.0'],
['60/3.0', '60/3.0']]) % >

< div class="form-group" style="float:hidden">
&nbsp
< %=link_to "筛选", list_courses_url(:credit),class: 'btn btn-xs btn-info' %>
&nbsp
< %=link_to "刷新", refresh_course_url(@course),class: 'btn btn-xs btn-info' %>
< /div>`

控制:

`  def list
    @course_filter=Course.where(:credit).all
    @course=@course-current_user.courses
    ……`

错误如下: image

PENGZhaoqing commented 7 years ago

你这个where参数都不传的啊

https://github.com/PENGZhaoqing/CourseSelect/issues/56

正确的应该是用params[:course][:credit]把获得的参数传入where方法

5663015 commented 7 years ago

我试了多种还是有错……(⊙﹏⊙)

`@course=Course.where("credit = ?  AND course_type =? AND  teaching_type =? AND exam_type =?", params[:credit],params[:course_type],params[:teaching_type],params[:exam_type])`
`@course=Course.where( :credit => params[:credit] , :course_type => params[:course_type] , :teaching_type => params[:teaching_type] , :exam_type => params[:exam_type]).all`

image

PENGZhaoqing commented 7 years ago

params用错了,params是一个至少两层以上的hash,你要获得的参数在course下面,例如params[:course][:credit](我上面写的你都不看的啊)

不确定的情况下,使用puts params[:course][:credit],把这个变量在log里打印出来看到底有没有

PENGZhaoqing commented 7 years ago

别一开始啪的以下就把所有参数都往里塞

应该是先从Course.where( :credit => params[:course][:credit])开始,如果这个结果对了再加下一个参数如:Course.where( :credit => params[:course][:credit]).where(:exam_type => params[:course][:exam_type])

不然这么多参数都往里传,debug的时候一个错了全都不能运行,推荐官方写法

http://guides.rubyonrails.org/active_record_querying.html

还有你这个错误(Missing Templates)好像是没找到视图的错误

5663015 commented 7 years ago

哦哦我再试试。实在不好意思,问你这么多,麻烦你啦~

ChenHao19931 commented 7 years ago

助教你好,请问上面提到的用这种方法,是在选项中显示40/2.0,那么选中之后,如何将其对应的value值传到credit中呢?

PENGZhaoqing commented 7 years ago

选中之后,用户点击提交,那么这个form表单的这个字段就会被提交到rails控制器里,在控制器里将这个字段取出来就行了