创建一个新的RubyonRails操作,以便在每次跟踪链接时更新一个布尔值

创建一个新的RubyonRails操作,以便在每次跟踪链接时更新一个布尔值,ruby,ruby-on-rails-4,controller,routes,controller-action,Ruby,Ruby On Rails 4,Controller,Routes,Controller Action,我已经在谷歌上搜索了大约一个小时的答案,在尝试让它与我所知道的rails一起工作了相当长的一段时间后,我决定“够了”就够了。在我的索引页面上,我想创建一个按钮,它的行为类似于默认的“删除”操作,但它会更新一个布尔值。这是我在控制器中的操作: def update_monitor_state @server_monitor.paused = not @server_monitor.paused redirect_to server_monitors_url end 我会告诉你我的路线,但

我已经在谷歌上搜索了大约一个小时的答案,在尝试让它与我所知道的rails一起工作了相当长的一段时间后,我决定“够了”就够了。在我的索引页面上,我想创建一个按钮,它的行为类似于默认的“删除”操作,但它会更新一个布尔值。这是我在控制器中的操作:

def update_monitor_state
  @server_monitor.paused = not @server_monitor.paused
  redirect_to server_monitors_url
end
我会告诉你我的路线,但我不知道如何让它做我想要的,我有基本的“资源:服务器监视器”,在尝试了每个人的路线后,这将为他们的基本博客网站添加一个新的显示页面。我只知道URI模式应该是“/server\u monitors/:id(:format)”和控制器操作“server\u monitors\35; update\u monitor\u 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 %>

嗯,您需要一些关于Rails的重要帮助。有一些规则:

没有变量可用于存储服务器状态。 毫无疑问,局部变量不能做到这一点

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

在生产环境中,将生成多个Rails进程来实现并发。您不知道哪个进程服务于当前请求和下一个请求,并且。。。由于进程不共享内存(好吧,你可以说是写时复制,但它只共享尚未更改的内存),类变量和全局变量也不起作用

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

重定向不会渲染视图
redirect\u to
helper只发送响应,响应中没有正文,只有一个
Location
头,头中有一个URL。当浏览器收到此类响应时,它将立即向该URL发送新请求。一个新的请求会破坏所有控制器实例变量,因为会创建一个全新的控制器实例来处理新的请求。

这很好,因为我正试图这么做。服务器监视器存储在MySQL数据库中,我只想根据监视器的状态将其更改为true或false。我只想做一个按钮,可以前后翻转布尔值的状态。我对rails比较陌生,但我有两个大项目要做,所有教程都很简单,没有解释更复杂的关系和困难的操作。对不起,我必须详细说明。我不是在处理运行rails应用程序的服务器的状态,而是在构建一个web应用程序,它将通过HTTP代码和ICMP回复来监控其他服务器。真正的问题是如何通过单击一个按钮只更改表中的一个值。
@server\u monitor.update(暂停:!@server\u monitor.pause)