更新后检查保存 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 %>
我的一个控制器的更新方法如下所示:
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 %>