Datamapper объект ноль при перенаправлении, обновление всегда загружается нормально
Я занимаюсь разработкой приложения на Rails, которое делает некоторые закулисные заговоры для генерации сравнения между различными наборами данных. То, что я вижу, это спорадическая ошибка 500 (ActionView::Template::Error
) о создании объекта сравнения в моей базе данных DataMapper. Это происходит иногда только на одной машине, каждый раз на другой машине и никогда на одной. Эти ошибки коррелируют с производительностью компьютера, что наводит меня на мысль, что DataMapper делает что-то странное за кулисами.
Я перестал преследовать "почему" и теперь просто пытаюсь отловить ошибку 500 и заставить обновление, чтобы рецензенты не увидели проблему. Однако все, что я пробовал, не сработало. Вот мои настройки:
comparisons_controller.rb
# This is the action which allows for generation of a new comparison. It uses a fork to spawn a child process which generates the comparison. Notifications will appear when this fails or finishes.
def create
first_set = get_msruns_from_array_of_ids(params[:comparison1].uniq)
second_set = get_msruns_from_array_of_ids(params[:comparison2].uniq)
comp = Comparison.new
comp.msrun_firsts = first_set
comp.msrun_seconds = second_set
comp.first_description = params[:first_description]
comp.second_description = params[:second_description]
comp.save
# This should capture the windows fork and prevent it.
if RbConfig::CONFIG['host_os'] === 'mingw32'
redirect_to :action => "show", :id => comp.id
result = comp.graph
a = Alert.create({ :email => false, :show => true, :description => "DONE WITH COMPARISON #{comp.id}" })
else
fork do
result = comp.graph
a = Alert.create({ :email => false, :show => true, :description => "DONE WITH COMPARISON #{comp.id}" })
end
flash[:notice] = "Comparison started. You will be notified when it completes."
# HERE I've attempted to capture problem
begin
render :action => "show"
rescue
redirect_to :action => "show", :id => comp.id
end
end
Это отображается в моем файле production.log:
ActionView::Template::Error (undefined method `first_description' for nil:NilClass):
1: /- @comparison ||= Comparison.get(params[:id])
2: /%h1= "Comparison ##{@comparison.id}"
3: %p <strong>User Description: </strong>
4: <p> Set#1: #{ @comparison.first_description }
5: <p> Set#2: #{@comparison.second_description }
6: <p> #{link_to "Edit", edit_comparison_path(@comparison)}
7: %ul.categories
app/views/comparisons/show.html.haml:4
Эта ошибка беспокоила меня в течение нескольких недель, но не дала мне. Любые идеи о том, почему или как поймать ошибку и принудительно обновить?
Благодарю.
1 ответ
Вы не должны загружаться @comparison
по вашему мнению, это ответственность контроллера. Вы также закомментировали строку, которая фактически назначает @comparison
так что не удивительно, что это оценивает как nil
,
Помните, что на create
здесь нет :id
параметр вообще. Это может объяснить, почему он работает только на перенаправлении, когда, наконец, эта информация доступна.
Что вы, вероятно, имели в виду, было так:
@comparison = Comparison.new
Это определит переменную для использования внутри ваших представлений независимо от параметров.