rails集合中的第一个和最后一个对象

时间:2012-06-05 06:04:44

标签: ruby-on-rails-3

在我的申请中,我有一个“学生”部分,将@students的集合传递给“学生”部分。这些最终显示在我的索引页面上作为学生的图像。当用户点击图片时,我会弹出一个包含学生照片和一些文字的框。现在,我有一个上一个/下一个按钮,允许用户循环学生。我实现了循环w / out插件...只是一个简单的ajax调用来加载下一个/上一个对象。我的问题是,当我在最后(或第一次)记录时,我无法检测到。我需要一种方法来设置第一个和最后一个对象的url参数。所以它看起来像这样:www.mysite.com/students/15?last=true

我找不到干净的方法来做到这一点。我也不确定我是否正确地思考这个问题。我应该附加url参数吗?或者我应该以某种方式修改对象,以便在从模型中检索它们之后添加其他属性?

谢谢。

[编辑]

只是想让这个更清楚一些。 当我弹出学生灯箱时,我有2个链接:上一个(链接到上一个记录)和下一个链接到下一个记录。我正在使用jquery $ .load方法发出一个ajax请求并将我想要的数据加载到我的灯箱中的div中,每当我点击上一个或下一个。

$( '以前')。点击( $('mydiv')。load('前学生的网址'); );

我通过在最初的弹出窗口走过dom树来获得'上一个/下一个学生的网址'。我存储了这些,所以我可以再次参考它们。

我的问题是,当我在列表中的第一个学生或最后一个学生时,我无法分辨。我需要知道这一点,所以我可以禁用上一个/下一个按钮。我想我可以通过rails / ruby​​或通过javascript来做到这一点。最初,我认为通过在链接或上一个/下一个学生上添加url参数(以指示它们是第一个还是最后一个),然后我可以在rails中检测到这个并执行简单的if / else来禁用链接。但是我一直试图以我指的是部分的方式来做这件事。

2 个答案:

答案 0 :(得分:1)

您需要最后一页,还是@students的最后一位学生? 我使用gem will_paginate列出页面和简单的JS“ajax”用于刷新下一页。您可以使用此gem并将每页的对象设置为1,例如:

@students = Student.order(sort_column + " " + sort_direction).paginate(:per_page => 1, :page => params[:page])

示例“ajax”students / index.js:

$('tbody').append('<%= j render(@students) %>');
<% if @students.next_page %>
  $('.pagination').replaceWith('<%= j will_paginate(@students) %>');
<% else %>
  $('.pagination').remove();
<% end %>

coffescript激活它:

if $('.pagination').length
        $(window).scroll ->
          url = $('.pagination .next_page').attr('href')
          if url && $(window).scrollTop() > $(document).height() - $(window).height() - 230
            $('.pagination').text("Načítavam...")
            $.getScript(url)
        $(window).scroll()

我从我的圣经中学到它;-) RailsCasts - Ryan Bates

答案 1 :(得分:1)

嗯,我是以我的灵感来做的,也许可以帮到你: 学生/指数 带有ajax加载列表的经典索引文件,will_paginate和我上面写的代码。每个学生都有链接的图像,链接有像/ student / 4和remote这样的东西:true。

学生秀控制器

@student = Student.find(params[:id])

学生显示js文件 经典的js渲染“学生”

student _student.html.erb 你的观点和两个视图助手:prev_help(params [:id])和next_help(params [:id])

助手:

def prev_help(id)
    @student = Student.find(id - 1)
    link_to("Prev". @student )  if @student.nil?        
end

def next_help(id)
    @student = Student.find(id + 1)
    link_to("Prev". @student )  if @student.nil?        
end

我现在没有时间,但是如果这个解决方案对您没有帮助,您明天可以写信给我,我会创建示例应用来测试我的解决方案并与您合作。