Перенаправление пользователей после уничтожения - PullRequest
1 голос
/ 06 мая 2010

У меня есть 3 модели: Вопросы, Ответы и Профили (я знаю, это должно называться «Пользователи»). Когда вы просматриваете вопрос Q, я запрашиваю в базе данных ответы на Q. (Они связаны по идентификатору.) В представлении текущий пользователь имеет возможность удалить свой ответ, щелкнув ссылку уничтожения, отображаемую рядом с его ответом. :

%table
  %tr
    %td
      Answers:
  - @answers.each do |a|
    %tr
      %td
        - @provider = Profile.find(a.provider)
        %i
          #{h @provider.username} said:
        %br
        #{h a.description}
      %td
        = link_to 'View full answer', a
      %td
        - if a.provider == @profile.id
          #{link_to 'Delete my answer', a, :confirm => 'Are you sure?', :method => :delete}

Проблема в том, что когда пользователь нажимает на ссылку уничтожения, он перенаправляется в / answers / index. Я хочу, чтобы он перенаправил в / questions / Q. Какой лучший способ сделать это?

Я знаю, что есть метод redirect_to, но я не знаю, как реализовать его, когда я хочу перенаправить на действие для другого контроллера. Также необходимо запомнить вопрос, ответ на который удаляется.

Я попытался передать что-то вроде: question_id в link_to как:

#{link_to 'Delete my answer', a, :confirm => 'Are you sure?', :question_id => @question.id, :method => :delete}

В ответе контроллера # destroy:

  def destroy
    @answer = Answer.find(params[:id])
    @answer.destroy

    respond_to do |format|
      format.html { redirect_to(answers_url) }
      format.xml  { head :ok }
    end

    @question = Question.find(params[:question_id])
    redirect_to question_path(@question)
  end

Информация: question_id не передается в метод уничтожения, поэтому я получаю эту ошибку:

Couldn't find Question without an ID

Для подтверждения я добавил puts вызов до Question.find, и он вернул nil.

Я также пытался сохранить идентификатор вопроса в информации о сеансе. AnswerSontroller # уничтожить изменения для вызова сеанса [: question_id] вместо params [: question_id]. Но я получаю другую ошибку:

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".

Я не уверен, как обратиться к ошибке. Куда мне положить return?

Любая помощь будет оценена !!

1 Ответ

4 голосов
/ 06 мая 2010

В действии, которое определяет поведение уничтожения, вы просто добавляете redirect_to по завершении.

redirect_to может использовать любой из вас стандартные вспомогательные методы url / rout:

Если у вас есть контроллер вопросов и связанные маршруты и действия, вы можете использовать:

redirect_to question_path(@question)

В вышеупомянутом отредактированном случае вам необходимо убедиться, что значение question_id передано правильно:

link_to 'Удалить мой ответ', answer_path (a,: question_id => @ question.id),: verify => 'Вы уверены?',: Method =>: delete

Второй параметр link_to - это рассматриваемый URL. Вы можете проверить сгенерированный HTML, чтобы убедиться, что данные отображаются так, как вы ожидаете.

Здесь также есть несколько других опций:

В зависимости от того, как настроены ваши маршруты и отношения, вы можете выбрать вариант «Ответить» как вложенный маршрут, который находится в контексте вопроса. Что даст вам набор помощников question_answer_path.

Если ответ принадлежит Вопросу, вы можете просто использовать answer.question_id в действии уничтожения и сохранить проблему: P

...