Как проверить, перенаправляет ли уже действие контроллера? - PullRequest
0 голосов
/ 26 января 2009

ОК, как это часто бывает, в моем приложении есть действие контроллера, которое защищено от несанкционированного доступа before_filter. Единственное, что мне нужно перенаправить это действие, если выполняется другое условие:

class Payment < ApplicationController
  before_filter login_required

  def new
    redirect_to some_other_path if @order.is_free?
    @payment = Payment.new
  end
end

В своем тестировании я проверяю, чтобы убедиться, что действие правильно защищено, однако это также тот случай, когда утверждение @ order.is_free верно. В этом случае я получаю следующую ошибку:

`render_with_no_layout': Can only render or redirect once per action

Есть ли способ проверить, чтобы убедиться, что я не перенаправляю, или переопределить существующее перенаправление?

Ответы [ 4 ]

3 голосов
/ 26 января 2009

Я предполагаю, что метод login_required выполняет перенаправление, если пользователь не вошел в систему. В этом случае:

Ваш фильтр до должен возвращать false после вызова перенаправления. Это предотвратит когда-либо новое действие. Более поздние версии rails автоматически делают это, если вы вызываете render или redirect в before_filter, поэтому, возможно, вы используете более старую версию.

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

2 голосов
/ 27 января 2009

Ваш класс должен быть PaymentController, а не Payment. Причина этого в том, что класс контроллера и класс модели не конфликтуют.

0 голосов
/ 26 января 2009

Фильтр до этого - красная сельдь. При @order_is_free? код одновременно настраивает перенаправление и проваливает рендеринг нового. Оператор redirect не контролирует поток метода. Добавьте оператор возврата после перенаправления, или вы можете даже вернуть перенаправление, как в return(redirect_to :action => :show, :id => @order, :controller => :free_orders)

0 голосов
/ 26 января 2009

Я не думаю, что ваш фильтр "до" является причиной двойной ошибки рендеринга. Посмотрите на этот пример:

class PostsController < ApplicationController
  before_filter :perform_a_redirect, :except => [:wtf]

  def index
    redirect_to 'http://google.com'
  end

  def wtf
    render :text => 'wtf'
  end

  private

  def perform_a_redirect
    redirect_to :action => 'wtf'
  end
end

При посещении / posts я перенаправляюсь на / posts / wtf. Нет двойной ошибки рендеринга. Предполагая, что ваш метод 'login_required' перенаправляет / отображает только один раз, я подозреваю, что код, который вы публикуете здесь, не является проблемой, но что-то еще вызывает это.

...