【问题标题】:Check for save after update Rails 4更新 Rails 4 后检查保存
【发布时间】:2015-10-20 21:08:32
【问题描述】:

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

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

【问题讨论】:

  • 您需要一个特定的函数作为回调(例如保存后执行一些其他任务)还是只是检查更新是否成功?
  • 我需要一个特定的功能。我的前端 UI 开发人员有一些需要回调的 jQuery。 AJAX 的东西有点新,所以如果您需要更多信息,请告诉我。我想我可以用 UJS (update.js.erb) 创建条件。我可以弄清楚,我的主要问题是我不知道如何检查保存然后执行功能。我不知道after_save 是否可行,如果可行,我将如何实现它。
  • 我想我需要更多信息。您想返回一个带有回调的 URL,以验证视频/节点是否已更新?以便您的 UI 开发人员可以向它发送 AJAX 请求?或者您是说根据视频和节点是否正确更新您要发送回调?
  • after_save 非常适合您每次保存或更新视频时都需要对视频实例和节点执行操作。
  • 对不起 - 是的,第二个 Or are you saying that based on whether the video and node were updated correctly you want to send a callback? 每次我从更新方法更新视频和节点时,我都会想做一些事情。

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


【解决方案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 %>

【讨论】:

  • 这被标记为答案第一部分的正确 b/c。
【解决方案2】:

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

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

【讨论】:

  • 感谢@TheSpurg。让我更进一步。如果我想在update.js.erb 而不是my_callback 内做某事怎么办?例如,如果两个更新都正确地抛出更新成功的闪烁消息,但如果没有抛出更新不成功的警报?
  • 也许设置一些你会传递给你的模板的变量?那将是一种方法。
  • @mike0416 根据您的评论进行了更新。这就是您要寻找的更多内容吗?
  • 谢谢。我相信你的回答是对的,@Swards 我应该能够想出一些东西。我将对其进行测试并重新签入。
【解决方案3】:

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

不应该使用与@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

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

由于我不知道这个规范,我不能给你任何具体的代码。

可以告诉你的是,如果你使用 ajax,你必须确保你理解 server-sideclient- 之间的区别侧面代码。

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

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

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2022-09-27
    • 2013-12-09
    • 2014-10-23
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多