0

かなり長い間レールについて知っていることで動作させようとした後、これに対する答えを約1時間グーグルで調べて、十分であると判断しました。インデックス ページで、デフォルトの「削除」アクションのように機能するボタンを作成したいのですが、代わりにブール値を更新します。これは私のコントローラーでの私のアクションです:

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ヘルパーは、本文のない応答を送信するだけですが、URL を含むヘッダーLocationが含まれます。ブラウザがそのような応答を受け取ると、すぐに新しいリクエストをその URL に送信します。新しいリクエストを処理するためにまったく新しいコントローラ インスタンスが作成されるため、新しいリクエストはすべてのコントローラ インスタンス変数を危険にさらします。

于 2015-11-27T00:50:02.787 に答える