更新Rails 4后检查保存

时间:2015-10-20 21:08:32

标签: ruby-on-rails ruby-on-rails-4 callback after-save

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

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已更新。最好的方法是什么?

3 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分: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 answer应该回答你的问题。

答案 2 :(得分:0)

滑轨&#39; .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

<强>的Ajax

  

我的前端UI开发人员有一些我需要回调

的jQuery

由于我不知道这个规格,我不能给你任何特定的代码。

可以告诉您的是,如果您正在使用ajax,则必须确保您了解服务器端&amp; 客户端代码。

我不想侮辱你的智慧,但我会为了后人的缘故解释它......

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