将属性添加到rails模型对象

时间:2012-09-04 18:19:45

标签: ruby-on-rails

我有一个模特学生。在 studentsController 中我选择了一个学生集合。我想在第一个和最后一个记录上附加一个标志。

我会显示学生名单,其中包含以下内容: students / _student ,当用户点击每个学生时,他们会弹出一个弹出窗口。

我想使用该标志来确定该学生是否是第一个/最后一个,以便我可以向网址添加查询参数。例如,当您将鼠标悬停在第一位学生上时,网址将如下所示: localhost:3000 / student / 1?location = first

当显示部分时,部分中不存在该集合,因此我不能像这样进行测试:student.first?

有什么想法吗?谢谢。

[编辑]。这本来是对@neils的回复,但我想我会把它放在那里: 它有效但我有另一个问题。因为我正在使用“自动滚动”功能,当用户向下滚动页面(一次3个)时会加载更多学生,“第一个”和“最后一个”将添加到每个学生的第一个和第三个学生中行而不是集合的实际第一个和最后一个。我自动滚动的方式:我使用$ .getScript来请求 index.js.erb 文件。该文件呈现 students / _student ,如下所示:渲染@students ,并附加到容器div。我在该模板中渲染网址( students / _student ),因此params每隔一次/第三次渲染一次。

3 个答案:

答案 0 :(得分:2)

如果需要,您可以继续render @students来电。请注意,当您这样做时,您可以在部分中为您提供student_counter帮助。现在,您可以将student_counter@students.size进行比较,并通过帮助者或装饰者设置link_to的{​​{1}}。

答案 1 :(得分:1)

假设您已经将一些学生集合分配给控制器中的@students(Student.allStudent.where(some_conditions),无论......),您可以执行以下操作:

attr_accessor :flag添加到您的Student模型中:

class Student < ActiveRecord::Base
  attr_accessor :flag
  #... rest of your code
end

这会在Student实例上创建一个非ActiveRecord属性。

你可以在控制器中做一些事情,比如:

@students[0].flag = 'first'
@students[-1].flag = 'last'

然后在您的视图中使用该信息。不是很优雅,但它应该可以解决问题。

编辑:详细阐述了上述内容,使其更加清晰。 EDIT2:修正了错误,attr_accessor是正确的方法,而不是attr_accessable ......

答案 2 :(得分:0)

我不确定我是否正确理解你的问题,但我会去拍它。

假设您使用@students作为列表的实例变量,您可以将学生列表传递给您的部分,如下所示:

<%= render 'students', :locals => {:students => @students} %>

students/_students内,您可以循环浏览列表并使用each_with_index确定其位置:

<% students.each_with_index do |student, index| %>