我的一个控制器的更新方法如下所示:
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已更新。最好的方法是什么?
答案 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 %>