Два оператора рендеринга в методе Ruby и ответ на вызов JQuery AJAX - PullRequest
0 голосов
/ 29 марта 2012

У меня есть несколько существующих методов в контроллере.Каждый из этих методов нуждается в проверке.

Для этого я создал метод проверки в контроллере приложения.

Я хочу вызывать этот метод проверки с самого начала каждого отдельного метода, которыйпрежде чем продолжить, проверит наличие у пользователя необходимых групп.Метод проверки возвращает true или false.Если методы проверки возвращают false, браузер перенаправляется на страницу «Ошибка проверки», а остальная часть этого метода не выполняется.Исходный метод вызывается с использованием JQuery.

Я покажу некоторый код и затем объясню, в чем проблема:

Jquery Ajax Request: (общий код, но только для иллюстрации)

jQuery.ajax({
    url:"examplecontroller/examplemethod/" + ID,
    success: function(data,textstatus,XMLHttpRequest)
    {
    }
})

Вызовы запроса JQuery метода:

def examplemethod
    id = ExampleDatabase.find(params[:id])

    #redirect to validationFail page if validation check returns false#
    render "/validationFail" if !(check_groups(id, "type"))

    ...other code etc...

    render :text => done

end

Метод завершения проверки:

def check_groups(id, type)

    ... other code etc ....

    if userGroups.include? requiredGroup then
        return true
    else
        return false
    end
end

Что касается этой строки, которая вызывает метод проверки -

render "/validationFail" if !(check_groups(id, "type"))

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

Моя проблема в том, что наличие второй строки 'render' делает недействительной первую.Если у меня есть вторая строка 'render', первая не перенаправляет на страницу 'validation fail'.Если я возьму вторую строку проверки, то ответ на вызов JQuery Ajax отсутствует (при условии, что метод проверяется и выполняется полностью).Это приводит к ошибке в Firebug, и, очевидно, мой «успешный» код AJAX не выполняется.

Я знаю, что мог бы использовать операторы IF для визуализации одного или другого, то есть:

def examplemethod
    id = ExampleDatabase.find(params[:id])

    if !(check_groups(id, "type")) then
        render "/validationFail"
    else

        ...other code etc...

        render :text => done

    end
end

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

Странно (насколько мне известно), что второй рендеринг влияет на первый, потому что, как я думал, использование рендера остановит последующее выполнение кода ... Я смотрел на использование redirect_to вместо первого рендера, но я не могне заставить это работать.

Кто-нибудь может предложить лучший способ сделать это?

1 Ответ

1 голос
/ 29 марта 2012

Я думаю, что вы ищете здесь before_filter.before_filters позволяет выполнять код и отображать содержимое перед выбранными действиями, отменяя действие, если фильтр возвращает false.Документацию по фильтрам можно найти здесь , но для примера кода вы, вероятно, ищете что-то вроде этого:

def TestController < ApplicationController
  before_filter :check_groups

  def examplemethod
    id = ExampleDatabase.find(params[:id])

    render :text => 'done'
  end

  private

  def check_groups
    if !(check_groups(id, "type"))
      render '/validationFail'
      return false
    end
  end
end

Возвращение false в воле before_filterостановить выполнение действия, не позволяя вызывать другие фильтры (или само действие).Если вы используете этот метод повсеместно, вы даже можете поместить его в свой контроллер приложений, и вы можете регулировать, какие методы before_filter выполняются, читая больше об этом в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...