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



我已经在谷歌上搜索了大约一个小时,试图用我对铁轨的了解来解决这个问题已经有一段时间了,我决定适可而止。在我的索引页面上,我想创建一个类似于默认"删除"操作的按钮,但它会更新布尔值。这是我在控制器中的操作:

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

我会向你展示我的路线,但我不知道如何让它做我想做的事,在尝试了每个人的路线后,我有了基本的"resources: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 %>

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

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

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

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

在生产环境中,将派生多个Rails进程以实现并发。你不知道哪个流程为你当前的请求和下一个请求提供服务,而且。。。由于进程不共享内存(好吧,你可以说写时复制,但这只共享尚未更改的内存),类变量和全局变量也不能完成这项工作。

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

重定向不呈现视图

redirect_to帮助程序只发送不带正文的响应,而是一个包含URL的Location标头。当浏览器收到这样的响应时,它会立即向该URL发送一个新的请求。新请求会影响所有控制器实例变量,因为会创建一个全新的控制器实例来处理新请求。

最新更新