У меня есть несколько существующих методов в контроллере.Каждый из этих методов нуждается в проверке.
Для этого я создал метод проверки в контроллере приложения.
Я хочу вызывать этот метод проверки с самого начала каждого отдельного метода, которыйпрежде чем продолжить, проверит наличие у пользователя необходимых групп.Метод проверки возвращает 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 вместо первого рендера, но я не могне заставить это работать.
Кто-нибудь может предложить лучший способ сделать это?