创建一个新的Ruby on Rails操作,每次跟踪链接时更新一个布尔值

时间:2015-11-26 21:59:28

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

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

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 %>

1 个答案:

答案 0 :(得分:0)

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

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

毫无疑问,地方变量无法做到这一点。

控制器的实例变量无法完成工作,因为控制器实例仅在单个请求期间存在。

在生产环境中,将生成多个Rails 进程以实现并发。您不知道哪个流程会为您当前的请求和下一个请求提供服务,并且......由于流程不会共享内存(嗯,您可以说 Copy on Write ,但是只分享尚未改变的记忆),类变量和全局变量也不能完成。

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

重定向不是渲染视图

redirect_to帮助程序只发送没有正文的响应,但发送带有URL的Location标头。当浏览器收到此类响应时,它会立即向该URL发送新请求。新请求会破坏所有控制器实例变量,因为会创建一个全新的控制器实例来处理新请求。