2015-09-02 3 views
0

Когда я представляю это:AbstractController :: DoubleRenderError

<%= simple_form_for(@missed_date, url: habit_level_missed_dates_path({ habit_id: @habit, level_id: @habit.current_habit_level.id }), remote: request.xhr?, html: { data: { modal: true } }) do |f| %> 

Модальное не исчезает, потому что страница не redirect_to :root_url, как это предполагают, чтобы создать с действием.

def create 
    habit = Habit.find(params[:habit_id]) 
    habit.missed_days = habit.missed_days + 1 
    habit.save! 
    level = habit.levels.find(params[:level_id]) 
    level.missed_days = level.missed_days + 1 
    if level.missed_days == 3 
     level.missed_days = 0 
     level.days_lost += habit.calculate_days_lost + 2 
    end 
    level.save! 
    head :ok # this returns an empty response with a 200 success status code 
    @missed_date = level.missed_dates.new(missed_date_params) 
    @missed_date.save 
    respond_modal_with @date_missed, location: root_path # How to intergrate with this line? 
    end 

Это происходит из-за ошибки:

AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".): 
    app/controllers/missed_dates_controller.rb:26:in `create' 

Теперь я знаю причину, которая является то, что у меня есть в form_for url: habit_level_missed_dates_path({ habit_id: @habit, level_id: @habit.current_habit_level.id }), но мне нужно, что там, по крайней мере, я так думаю, чтобы передавать эти атрибуты при создании.

Как это изменить, чтобы пользователь, нажав кнопку отправки в форме @missed_date, пропустил идентификатор, и он перенаправлен обратно на root_url?

Я следовал этому руководству для модальной логики: http://www.jetthoughts.com/blog/tech/2014/08/27/5-steps-to-add-remote-modals-to-your-rails-app.html.

ответ

2

Вы вызываете head, который возвращает ответ только для заголовка see Using head To Build Header-Only Responses on Rails Guides. Вызов head является эквивалентом оператора return в блоке рендеринга. Похоже, вы звоните head, а затем продолжаете визуализировать больше кода, следовательно, ошибку двойного рендера. Вам, вероятно, не нужна эта строка, потому что код ответа по умолчанию - 200 в любом случае.

+0

Большое вам спасибо! Отлично. –

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