0

在试图让它与我对 Rails 的了解相当长一段时间后,我一直在谷歌上搜索大约一个小时的答案,并决定足够了。在我的索引页面上,我想创建一个按钮,其作用类似于默认的“删除”操作,但它会更新一个布尔值。这是我在控制器中的操作:

def update_monitor_state
  @server_monitor.paused = not @server_monitor.paused
  redirect_to server_monitors_url
end

我会向您展示我的路线,但我不知道如何让它做我想做的事,并且在尝试了每个人的路线后,我拥有基本的“资源:server_monitors”,这些路线可以为他们的基本博客网站添加新的显示页面。我只知道 URI 模式应该是 '/server_monitors/:id(.:format)' 和控制器操作 'server_monitors#update_monitor_state',我想在视图中调用它,比如调用 'delete'。

<% @server_monitors.each do |monitor| %>
  <tr>
    <td><%= monitor.monitor_name %></td>
    <td>
      <% if monitor.paused %>
        <%= link_to 'Start', monitor, method: :update_monitor_state %>
      <% else %>
        <%= link_to 'Pause', monitor, method: :update_monitor_state %>
      <% end %>
    </td>
    <td><%= link_to 'Destroy', monitor, method: :delete %></td>
  </tr>
<% end %>
4

1 回答 1

0

好吧,你需要一些关于 Rails 的认真帮助。有一些规则:

没有变量可以用来存储服务器状态。

毫无疑问,局部变量不能做到这一点。

控制器的实例变量不起作用,因为控制器实例仅存在于单个请求期间。

在生产环境中,会产生多个 Rails进程来实现并发。您不知道哪个进程为您当前的请求和下一个请求提供服务,并且...由于进程不共享内存(好吧,您可能会说Copy on Write,但这仅共享尚未更改的内存),类变量和全局变量也不起作用。

存储服务器状态的唯一方法是使用某种外部存储,例如数据库,它在所有 Rails 进程之间共享。

重定向不是渲染视图

redirect_to助手只发送没有正文但Location包含 URL 的标头的响应。当浏览器收到这样的响应时,它会立即向那个 URL 发送一个新的请求。一个新请求会破坏所有控制器实例变量,因为创建了一个全新的控制器实例来处理新请求。

于 2015-11-27T00:50:02.787 回答