2

私のコントローラーの 1 つの更新メソッドは次のようになります。

def update
  @node = Node.find(params[:id])
  @video = @node.media
  @node.update(node_params)
  @video.update(title: @node.name, description: @node.description)
end

@node と @video が更新されたことを確認するために、コールバックが必要です。これを行う最善の方法は何ですか?

4

3 に答える 3

1

更新が成功するかどうかをテストできます...

  if @node.update(node_params)
    # handle success
    if @video.update(title: @node.name, description: @node.description)
      # etc...
    end
  else
    # handle fail
  end

ajax リクエストでは、条件をビューに入れることができます。

<% if @node.errors.any? %>
  alert('<%= j(@node.errors.full_messages.join("\n")) %>');
<% else %>
  alert('Success')
<% end %>
于 2015-10-20T21:49:32.997 に答える
0

Rails'.saveと . アクションが成功したかどうかに応じて (ブール値) をupdate返します。true/false

フローでそれを利用する標準的な方法は次のとおりです。

def update
  @node = Node.find params[:id]

  respond_to do |format|
     if @node.update(node_params)
        format.js #-> invokes /views/nodes/update.js.erb
        format.json { render json: @node.to_json }
        format.html
     else
        format.js #-> invokes /views/nodes/update.js.erb
        format.json
        format.html
     end
  end
end

とまったく同じデータを使用するべきではありません-モデルでそれを行うことができます。必要に応じて説明できる関連などを使用するのが最適です。@video.update@node

#app/models/node.rb
class Node < ActiveRecord::Base
   belongs_to :media #?
   before_save :set_media, on: :update

   private

   def set_media
     self.media.name = self.name
     self.media.description = self.description
   end
end

アヤックス

私のフロントエンド UI 開発者は、コールバックが必要な jQuery をいくつか持っています。

これについての仕様がわからないので、具体的なコードを提供することはできません。

言えることは、ajax を使用している場合は、サーバー側クライアント側のコードの違いを理解していることを確認する必要があるということです。

あなたの知性を侮辱するつもりはありませんが、後世のために説明します...

フロントエンド ajax は次のようになります。

#app/assets/javascripts/application.js
$(document).on("click", ".element", function(){
   $.ajax({
      url: "...",
      data: ....,
      success: function(data) { },
      error: function(response) {}
   });
});

...これはクライアント側のコードであるため、サーバーから返されたデータのみを処理できます。よくある誤解は、Ruby のコード/メソッドをこの中で使用できると多くの人が考えていることです。いいえ。

事前にパッケージ化されたデータのみをこれに送り返すことができるため、データを調整したい場合は、次のようにします。

def update
   @node = Node.find params[:id]
   @returned = "yes" if @node.update(node_params)
   render [x], layout: !request.xhr?
end 

これにより、フロントエンド JS を使用して操作できる条件付きデータを送り返すことができます。

$.ajax({
 ...
 success: function(data) {
    ... do something with data
 }

--

サーバー側のコードを使用したい場合は、組み込みのformat.js機能を使用することをお勧めします。

def update
   @node = Node.find params[:id]
   respond_to do |format|
      format.js #-> app/views/nodes/update.js.erb
   end
end

これにより、JSサーバー側でレンダリングされ、ブラウザーに渡されるため、Ruby コードを使用できます。詳細についてはわかりませんが、それを使用して次のことができることはわかっています。

#app/views/nodes/update.js.erb
<% if @node.something %>
   $("js")....
<% else %>
   ...
<% end %>
于 2015-10-21T11:32:21.643 に答える