我的一个控制器的更新方法如下所示:
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.update(node_params)
@video.update(title: @node.name, description: @node.description)
end
我需要回调以确保 @node 和 @video 已更新。最好的方法是什么?
你可以测试一下更新是否成功...
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 %>
轨道'.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 %>
根据您所说的,我认为这可能是您想要的
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的答案应该回答你的问题。