2

我的一个控制器的更新方法如下所示:

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

轨道'.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

确实允许您使用 Ruby 代码,因为 JS 在服务器端呈现并传递给浏览器。我不确定具体细节,但我知道您可以使用它执行以下操作:

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

根据您所说的,我认为这可能是您想要的

def update
  @node = Node.find(params[:id])
  @video = @node.media
  @node_saved = true
  @video_saved = true
  begin
      @node.update_attirbutes!(node_params)
  rescue ActiveRecord::RecordInvalid
      @node_saved = false
  end

  begin
      @video.update_attributes!(title: @node.name, description: @node.description)
  rescue ActiveRecord::RecordInvalid
      @video_saved = false
  end

  render "mypage"
end

在你的 update.js.erb 里面

...
if (<%= @node_saved %> === false) {
   // trigger flash message
};

if (<%= @video_saved %> === false) {
   // trigger flash message
};

我可能仍然误解你想要什么,但这个或@Swards的答案应该回答你的问题。

于 2015-10-20T21:28:50.133 回答