2015-10-20 4 views
2

Метод обновления для одного из моих контроллеров выглядит следующим образом:Проверка для сохранения после обновления 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 обновляется. Каков наилучший способ сделать это?

+0

вам нужна определенная функция в качестве обратного вызова делать (например, сделать некоторые другие задачи после сохранения) или вы просто проверить, что обновление прошло успешно? – wspurgin

+0

Мне нужна определенная функция. У моего интерфейса пользовательского интерфейса есть jQuery, для которого мне нужен обратный вызов. Немного новичок в материалах AJAX, поэтому дайте мне знать, если вам нужна дополнительная информация. Я решил, что могу создать условие с UJS (update.js.erb). Я могу понять это, но моя основная проблема заключается в том, что я не знаю, как проверить сохранение, а затем выполнить функцию. Я не мог понять, будет ли работать 'after_save', и если да, то каким образом я его реализую. – mike0416

+0

Думаю, мне понадобится немного больше информации. Вы хотите вернуть URL-адрес с обратным вызовом, который проверяет, обновляется ли видео/узел? Чтобы разработчик пользовательского интерфейса мог отправить запрос AJAX на него? Или вы говорите, что на основании того, правильно ли были обновлены видео и узел, вы хотите отправить обратный вызов? – wspurgin

ответ

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 %> 
+0

Это было отмечено правильно b/c первой части ответа. – mike0416

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 должны ответить на ваш вопрос.

+0

Спасибо @ TheSpurg. Позвольте мне сделать еще один шаг. Что делать, если я хочу что-то сделать в 'update.js.erb' вместо' my_callback'? Например, если оба обновления корректно выведут флэш-сообщение о том, что обновление прошло успешно, но если оно не вызвало предупреждение о том, что обновление не увенчалось успехом? – mike0416

+0

Может быть, установите некоторую переменную, которую вы передадите в свой шаблон? Это был бы один подход. – wspurgin

+0

@ mike0416 сделал обновление на основе вашего комментария. Это больше того, что вы искали? – wspurgin

0

Rails' .save и. update return true/false (boolean) в зависимости от того, было ли действие успешным.

Стандартный способ использования, что в вашем потоке выглядит следующим образом:

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, вы должны убедиться, что вы понимаете разницу между на стороне сервера & стороны клиента код.

Я не хочу оскорблять ваш интеллект, но я объясню это ради потомства ...

Frontend Аякса будет выглядеть следующим образом:

#app/assets/javascripts/application.js 
$(document).on("click", ".element", function(){ 
    $.ajax({ 
     url: "...", 
     data: ...., 
     success: function(data) { }, 
     error: function(response) {} 
    }); 
}); 

... так как это клиентская сторона код, вы можете иметь дело только с данными с сервера. Общим недоразумением является то, что многие люди думают, что они каким-то образом смогут использовать 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 %> 
Смежные вопросы