5

Извините, если вопрос очевиден, я только начинаю работать с Rails.
У меня есть следующий код в несколько методов контроллера в настоящее время:Rails Newbie: рекомендации по обработке ошибок в контроллере

respond_to do |format| 
    if @project.save 
     format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') } 
     format.js 
    else 
     format.html { render :action => "edit" } 
     format.js #... 
    end 
end 

Таким образом, вопрос, что это лучший способ сделать то же самое для ошибок во всех методах?
Рекомендуется ли использовать save! и обрабатывать его в rescue_action?

Или должен ли я сделать свой собственный метод respond и пройти save в блоке?

ответ

16

Часто бывает полезно использовать исключающий вариант сохранения и спасения, который позже в блоке, чем для такой ветви. Преимущество для исключений заключается в том, что они выйдут из транзакций.

def create 
    @project.save! 

    respond_to do |format| 
    format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') } 
    format.js 
    end 

rescue ActiveRecord::RecordInvalid 
    respond_to do |format| 
    format.html { render :action => "edit" } 
    format.js #... 
    end 
end 

Вы обнаружите, что это становится действительно сложно пререкаться свой путь из кучи вложенных if заявления при попытке сохранить более одного объекта в то время, но простой rescue исключения будет обрабатывать аккуратно ,

def create 
    Project.transaction do 
    @project.save! 
    @something_else.save! 
    @other_stuff.save! 
    end 

    # ... 
rescue ActiveRecord::RecordInvalid 
    # ... 
end 

Если какой-либо из этих сейвов взрывается, вы получите исключение. Чтобы убедиться, что все из них отображают ошибки проверки, вам, возможно, придется называть .valid? для каждого, чтобы заполнить их, или вы получите их после того, как ошибка осталась непроверенной.

+0

Это кажется хорошей идеей, но почему леска не идти по этому пути? Также предположим, что вы рекомендуете использовать 'rescue_action', если таких методов несколько? –

+0

Хорошо, я собираюсь предположить, что вы имели в виду обработчик 'rescue_from' или' rescue_action_in_public' для нескольких методов, и в этом случае Chubas отвечает здесь, является подмножеством этого, и я должен принять это в качестве ответа. –

+0

Как правило, я использую 'rescue_from' для вещей, которые не могут быть легко восстановлены, и' rescue', когда я смогу с ним справиться. Когда 'create' терпит неудачу, обычно вы просто визуализируете форму' new' снова. Что-то более абстрактное вообще возвращает красивую страницу «Uh oh». – tadman

3

Неплохо использовать шаблон if @object.save. Однако, если вы делаете то же самое для всех своих действий на своем контроллере, вы можете определить действие rescue_from.

Something like

class MyController < ActionController::Base 
    rescue_from ActiveRecord::RecordInvalid do 
    render :action => edit 
    end 
end 
+0

Да, это был один из моих опций, но такая потребность в '!' Версии, не так ли? Вы знаете, почему эшафот по умолчанию не идет? Мне кажется лучше. –

+0

Ваши и и @ tadman оба, похоже, дополняют друг друга, поэтому я бы согласился с ними, если мог, но, к сожалению, я должен был выбрать один. –

 Смежные вопросы

  • Нет связанных вопросов^_^