在项目中,往往会有搜索这个功能,比如说有一个 User,然后 User 有 name(名字),age(年龄),sex(性别),created_at(创建时间) 几个属性。rails g scaffold..生成了可以 crud 操作的简单应用。现在想在 users/index.html.erb 这个页面里实现查询功能。比如说按名字查询,按年龄段查询,大家都会怎么实现呢。 我先说说我的,我是初学者,也不知道自己的方法是不是对的。 我先创建一个 search 控制器,然后在 users/index.html.erb 里添加一个 form_tag,它的 action 的动作指向一个 search 控制器,在 form_tag 里有一个 text_field,通过它把数据传到 search 控制器里面,再用这个接受的这个数据执行 User.find_by_name(也可能是别的),查出数据赋给@SearchUsers,然后跳转道 search/index.html.erb,在把@SearchUsers的值读出来,显示在页面上。 这样的方法很笨,每次都要跳转到一个新的页面,也不能重复查询,请问大家都是怎么实现这个功能的呢。
View 中 <%= form_tag("/list/index",method: "get") do %> #/list/index 当前页面地址 <%= label_tag(:q, "搜索:") %> <%= text_field_tag(:q) %> <%= submit_tag("确定") %> <% end %>
Controller 中 def index a = params[:q] if a.blank? @products = Product.where(flag: 1).order(created_at: :desc) else @products = Product.where("(flag = 1 AND area = :p) OR (flag = 1 AND name = :p)", p:params[:q]).order(created_at: :desc) end end
我的和楼上差不多,一般不另外做页面,直接在 index 里做过滤
def index
if params.has_key?(:user)
params.require(:user).permit!(:name)
@users = User.where(params[:user])
else
@users = User.all
end
end
@products = Product.where(flag: 1).order(created_at: :desc)
flag: 1 是什么意思啊 还有这句话
@products = Product.where("(flag = 1 AND area = :p) OR (flag = 1 AND name = :p)", p:params[:q])
不太懂,嘿嘿
http://guides.ruby-china.org/active_record_querying.html 楼主应该先把 Rails Guides 过一遍 范围可以这样写
Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
#11 楼 @zerzerheart 时间段查询可以像楼上一样使用 Range,view 里用 select_data 就可以了。
http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
使用 ajax 对用户来说比较友好,不会刷新整个页面让使用者觉得卡顿,步骤如下:
1、将要局部刷新的地方(就是你要展示的数据的 html)做成单独视图_A.html.erb 2、在父页面 (你的 index) 中使用一个 div,等待将_A 渲染在此处
<div id="show_table"></div>
3、在 form 中加入 data-remote=“true”属性,如此才会发出 ajax 请求,并指定属性 action="foo" 4、在 controller 相应的方法 (foo()) 中响应 js 请求:
# 查询db
respond_to do |format|
format.js
end
5.创建 foo.js.erb 文件将父页面中 render 语句转换成 javascript 后添加到父页面中
$("#show_table").html("<%= escape_javascript(render :partial => 'A')%>")
6.为 form 中的 action 加入相应的路由
#21 楼 @zerzerheart 如果不用 ajax,可以开启 Turbolinks,这样也可以没有换页效果。