【问题标题】:Adding attribute to rails model object向rails模型对象添加属性
【发布时间】:2012-09-04 18:19:44
【问题描述】:

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

我会用这样的部分显示学生列表:students/_student,当用户点击每个学生时,他们会得到一个弹出窗口。

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

当显示部分时,部分中不存在集合,所以我不能只做这样的测试:student.first?

有什么想法吗?谢谢。

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

【问题讨论】:

  • 为什么不使用 params[:location] 在 url 中传递它??
  • 请添加一些代码以便于解决问题。
  • @Sush 我不确定我理解你的意思。我将使用 params[:location] 将其取回并确定它是第一项还是最后一项。我的问题是首先将位置参数附加到 url。我需要弄清楚什么时候附上它,所以我需要知道哪个是第一个,哪个是最后一个。
  • @soundar 我现在正忙于日常工作,所以我不能在以后粘贴任何代码。你有什么具体要我解释的吗?感谢您的回复。
  • 好的。你是否像渲染“学生”一样渲染学生,:collection => @students ?

标签: ruby-on-rails


【解决方案1】:

如果需要,您可以继续拨打render @students。请注意,当您执行此操作时,您会神奇地在您的部分中为您提供一个 student_counter 助手。现在在您的部分中,您可以将student_counter@students.size 进行比较,并通过助手或装饰器设置您的link_to:location=>'first/last'

【讨论】:

  • 我一定会试试这个。谢谢!
【解决方案2】:

假设您已经在控制器中将一些学生集合分配给@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...

【讨论】:

  • niels 你认为@students[0] 的内容是什么?
  • 嗯,已经够优雅了。谢谢@Neils!
  • 刚刚检查了这个,但这不起作用。 @students 上没有 flag 方法。
  • @berto77,您必须为flag 创建一个属性。您不能随意分配它。
  • 经过片刻的考虑,我认为我的解决方案虽然应该可行,但违反了一些最佳实践:它在模型和控制器中引入了视图逻辑。所以,使用风险自负! :)
【解决方案3】:

我不确定我是否正确理解了您的问题,但我会试一试。

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

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

students/_students 中,您可以遍历列表并使用each_with_index 确定它们的位置:

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

【讨论】:

  • 嗨@Terence 感谢您的回答。我试图避免在我的观点中做一个循环。我正在尝试使用像这样的最佳实践:render :@students 其中被渲染的实际部分是students/_student 对于@students 中的每条记录;没有明显的循环。见这里:rails-bestpractices.com/posts/61-simplify-render-in-views
  • @berto77,您在问题中说您希望集合出现在您的部分中,但您试图避免在您的视图中进行循环?这两种说法是相互矛盾的。你到底想完成什么?此外,使用render 'students', :locals =&gt; {:students =&gt; @students}(根据您的链接不一定是不好的做法)而不是render @students 的目的是使用each_with_index。执行第二个选项只会导致使用each
  • 如果你愿意,你可以继续你的“render @students”调用。请注意,当你这样做时,你神奇地在你的部分中为你提供了一个 student_counter 助手。现在在你的部分中,你可以将 student_counter 与 @students.size 进行比较,并通过 helper 或 decorator 设置你的 link_to 的 :location=>'first/last'
  • 我不知道那个帮手。谢谢。直到。您可能应该将其发布为答案。
  • @keikun17 谢谢!这完全有道理。我会在下午 5 点后试一试 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多