2012-05-04 3 views
2

Я получаю двойную ошибку рендеринга, от которой я не могу избавиться в методе обновления моей модели.Не могу избавиться от AbstractController :: DoubleRenderError

Вот код для контроллера

class Admin::CmsHappeningNowFeatureController < ApplicationController 

    def index 
     # Various model data retrieval... 

     render 'admin/cms/hn_features/index', layout: 'admin_cms' 
    end 

    # Works fine 
    def edit 
     @feature = CmsHappeningNowFeature.find_by_id(params[:id]) 
     render 'admin/cms/hn_features/feature', layout: 'admin_cms' 
    end 

    # Throws a AbstractController::DoubleRenderError upon submission 
    def update 
     @feature = CmsHappeningNowFeature.find_by_id(params[:id]) 
     @feature.attributes = params[:cms_happening_now_feature] 
     if @feature.save 
      redirect_to(:action => index, :notice => "Successfully updated feature.") and return 
     end 
     render 'admin/cms/hn_features/feature', layout: 'admin_cms' 
    end 

    # ... rest of the class 
end 

При перенаправлении на другой контроллер, проблема исчезает. Кажется, что перенаправление на один и тот же контроллер делает рельсы исполнением метода без фактической отправки перенаправления. При просмотре журнала при отправке формы обновления вызывается update, затем вызывается index, render из индекса и , затем выдается и не выполняется перенаправление.

Что мне не хватает? Каков обходной путь?

ответ

4

Хорошо, реальной причиной является то, что в

redirect_to(:action => index, :notice => "Successfully updated feature.") and return 
#      ^^^^^ This calls the index method 

вы вызываете метод index, который затем отображает первый. Затем вызов redirect_to получит результат этой функции (который будет тем, что вызывается render в index). и делает второй раз

То, что вы действительно хотите, чтобы написать это:

redirect_to(:action => :index, :notice => "Successfully updated feature.") and return 

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

+0

Ха! Благодаря!Я не заметил, что ': action => index' фактически вызывал' index' и возвращал результат в ': action' – Damp

0

у вас есть

if @feature.save 
    redirect_to(:action => index, :notice => "Successfully updated feature.") and return 
end 

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

Попробуйте это и дайте мне знать, если он работает:

if @feature.save 
    index 
    flash[:notice] = "Successfully updated feature." 
    return 
end 
+1

Это работает, однако, URL-адрес не обновляется, и если пользователь обращается к обновлению, форма получает повторно представленную, что является большим недостатком ... это все преимущество использования перенаправления. Единственный способ, которым я смог это исправить, - указать путь, например, redirect_to admin_cms_hn_feature_index_path,: notice => «Успешно обновленная функция». и return' – Damp

+0

Я не знаю, почему команда redirect_to фактически выполнила действие 'index' перед перенаправлением на него. Это сбивает с толку, а не то, что вы ожидаете от команды. – Damp

0

Я также столкнулся с этой проблемой, однако это не связано с перенаправлением на несколько контроллеров. У нас было действие, которое запускает электронную почту напрямую, без очереди на бэкэнд, чтобы включить его. Это использует драгоценный камень ActionMailer, который, как мне кажется, делает рендеринг на .haml или другом шаблоне для генерации html для электронной почты. После этого мы отправили по электронной почте запрос на обновление рендеринга в конце

Может ли это вызвать эту ошибку? Rails считает, что ActionMailer для рендеринга шаблона электронной почты является регулярным рендером? Его просто догадка, не уверен, что еще это может быть ..... также я не могу воспроизвести его на 100%, но не похож на ситуацию с параллелизмом, как в журналах. Я вижу только один вызов контроллера.

Любые идеи приветствуются, спасибо.

+0

FYI Я обнаружил причину этого. Он появляется, если rabl настроен определенным образом с дочерним узлом и ожидает один элемент, но получает несколько раз, что может произойти. Таким образом, его вид, как ребенок, включал rabl, будет отображаться дважды неочевидно, и это происходит. Я был удивлен этим, думал, что у json будет только двойная/дополнительная информация. – bjm88