当我在rails中刷新页面时,我在哪里保存一个不应该被覆盖的变量

时间:2015-09-11 14:01:42

标签: ruby-on-rails ruby ruby-on-rails-3

我对Rails和Ruby很陌生,仍然围绕着Rails的漏洞概念。

我想做什么: 我正在创建一个具有一周视图的班次计划器,并希望创建一个显示下一周/上周的按钮。

我做了什么:

我有3个相关的表。轮班,人和考试(包含轮班类型) 测试和人与Shift有一对多的关系。

在我的控制器中,我做了以下事情:

def index
  @todos = Todo.all
  @shifts = Shift.all
  @people = Person.all

  @start_of_week = Date.new(2015,8,7)
  @end_of_week = Date.new(2015,8,11)

视图:

<% person.shifts.where(:date_of_shift =>  @start_of_week..@end_of_week).order(:date_of_shift).each do |shift| %>
    <td>
        <%="#{shift.test.name} #{shift.date_of_shift}"%>
    </td>
<%end%>

我的想法是我会建立一个链接,我将增加两个日期并刷新我的页面

<a href="/todos/new">
    Next Week
    <% @start_of_week += 7 %>
    <% @end_of_week += 7 %>
</a>

不幸的是,这不起作用。每次我在控制器中调用索引函数时都会将日期设置为默认值。

我非常无能为力地解决这个问题。 我唯一能以某种方式将日期作为参数传递给索引函数或类似的东西。

一般结构是: 我只是为了拥有一个视图/控制器和我的3个表来搭建一个Todo视图/控制器/数据库。

请求帮助。 PS:我在lubuntu15上使用当前版本的ruby和rails(不应该真的很重要^^)

1 个答案:

答案 0 :(得分:0)

每当有人loads页面时,都会调用控制器方法。如果你想拥有临时持久存储,你应该查看cookie(通常会话更容易使用,但在你的情况下,让客户端更改数据可能也是相关的,点击后退/前进按钮,你不想每次小交互都有HTTP请求,对吧?)。您可以找到相关文档here

使用变量可能如下所示:

# in the controller
cookies[:start_of_week] ||= Date.new(2015,8,7)

# in the view
cookies[:start_of_week]

如果你打算在客户端使用它,也许你想在这里使用整数而不是日期对象,但是你必须在你的视图中考虑到这一点。

编辑:在重新阅读您的问题时,我意识到我的答案没有解决几个问题。

为什么您尝试的代码不起作用?

<a href="/todos/new">
  Next Week
  <% @start_of_week += 7 %>
  <% @end_of_week += 7 %>
</a>

在编写视图时,您必须知道它将在服务器端进行评估,然后发送到客户端(在本例中为Web浏览器)。您可以在呈现页面时增加实例值@start_of_week@end_of_week,但不能更晚。

所以要么你有链接转到你的控制器中的一个特殊动作,它将处理新的值设置cookie /会话变量(稍后只有一个选项)并渲染一个新页面并将其发送回用户你使用Javascript并在客户端执行此操作并更改cookie,因此不必进行任何必要的附加请求(但是考虑到这一点,您很可能需要从服务器加载数据)无论如何它可能没有任何区别你采取的)。