【问题标题】:Creating a new Ruby on Rails action to update one Boolean value each time the link is followed创建一个新的 Ruby on Rails 操作以在每次点击链接时更新一个布尔值
【发布时间】:2016-03-01 01:50:20
【问题描述】:

在尝试让它与我对 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 %>

【问题讨论】:

    标签: ruby ruby-on-rails-4 controller routes controller-action


    【解决方案1】:

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

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

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

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

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

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

    重定向不呈现视图

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

    【讨论】:

    • 那太好了,因为这是我想要做的。 Server_monitor 存储在 MySQL 数据库中,我只想将 monitor_state 更改为 true 或 false,具体取决于它已经是什么。我只想制作一个按钮来来回翻转布尔值的状态。我对 Rails 比较陌生,但我有 2 个大项目要做,所有教程都很简单,不解释更复杂的关系和困难的操作。
    • 对不起,我必须详细说明。我不是在处理运行 rails 应用程序的服务器的状态,我正在构建一个 Web 应用程序,它将通过 HTTP 代码和 ICMP 回复监视其他服务器。真正的问题是如何通过一键单击更改表格中的一个值。
    • @server_monitor.update(pause: !@server_monitor.pause)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多