更新后检查保存 Rails 4

Check for save after update Rails 4

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

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 已更新。执行此操作的最佳方法是什么?

根据你所说的,我想这就是你想要的

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 应该回答你的问题。

您可以测试一下是否更新成功...

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

Rails' .save 和 .update return 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

不应该 使用与 @node 完全相同的数据来使用 @video.update - 您可以在模型中这样做。你最好使用关联等,如果需要我可以解释。

#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

Ajax

My front-end UI developer has some jQuery that I need a callback for

因为我不知道这个的规范,所以我不能给你任何具体的代码。

可以告诉你的是,如果你使用ajax,你必须确保你理解server- side & client-side code.

我不想侮辱你的智商,但为了后代,我会解释一下...

前端 ajax 将如下所示:

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

...因为这是客户端代码,你只能处理来自服务器的数据returned .一个常见的误解是许多人认为他们可以以某种方式在其中使用 Ruby code/methods。编号

您只能将预先打包的数据发回给它,所以如果您希望您的数据符合条件,您可以这样做:

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