Проблема: Я написал приложение Angular/Rails, и когда я пытаюсь получить доступ к функции контроллера Rails от углового контроллера, я получаю сообщение об ошибке: Uncaught TypeError: tasks.moveOrder is not a function
, но все остальные функции на что страница доступныУгловые + рельсы: Угловые не могут найти функции контроллера
tasks_controller.rb
def index
respond_with Task.all
end
def create
respond_with Task.create(task_params)
end
def destroy
task = Task.find(params[:id])
task.destroy
respond_with task
end
def show
respond_with Task.find(params[:id])
end
def moveOrder # This is the function that cannot be found
task = Task.find(task_id)
task.position = pos
respond_with task
end
def up_completion
task = Task.find(params[:id])
task.increment!(:completion)
respond_with task
end
def down_completion
task = Task.find(params[:id])
task.decrement!(:completion)
respond_with task
end
private
def task_params
params.require(:task).permit(:title, :completion, :importance, :steps, :clicked, :position)
end
Каждая из этих функций имеют маршруты и каждая функция вызывается через мой угловой контроллер:
MainCtrl.js
.controller('MainCtrl', [
'$scope',
'tasks',
function($scope, tasks){
$scope.tasks = tasks.tasks;
$scope.items = ['one', 'two', 'three'];
$scope.addTask = function() {
var taskPosition = tasks.tasks.length + 1;
if(!$scope.title || $scope.title === '') { return; }
tasks.create({ // This call to the .rb file works!
title: $scope.title,
importance: $scope.importance,
completion: 0,
steps: $scope.steps,
clicked: false,
position: taskPosition // puts position as field in db (needs to be updated when dragged)
});
$scope.title = '';
$scope.importance = '';
$scope.steps = '';
};
$scope.moveTask = function(start_pos, end_pos) {
$.get("http://localhost:3000/tasks.json")
.done(function(data) {
var task_id = data[start_pos].id;
tasks.moveOrder(task_id, end_pos) // This call to the .rb file fails!
});
};
...
app.js
.config([
'$stateProvider',
'$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'home/_home.html',
controller: 'MainCtrl',
resolve: {
taskPromise: ['tasks', function(tasks){
return tasks.getAll();
}]
}
})
.state('tasks', {
url: '/tasks/{id}',
templateUrl: 'tasks/_tasks.html',
controller: 'TasksCtrl'
});
$urlRouterProvider.otherwise('home');
}]);
ли вызов функции неудачу, потому что я неправильно написал что-то или есть какой-то другой вопрос вообще?
Вы не можете вызвать серверные функции из кода на стороне клиента. (Разрешение этого будет серьезной уязвимостью безопасности.) Вместо этого используйте запрос AJAX. – Ajedi32
Тогда почему я могу назвать другие функции? в файле 'tasks_controller.rb' (т. е.' tasks.create', 'tasks.up_completion',' tasks.down_completion' (не показаны) и т. д.? –
Touché. Я не знаком с Angular, но думаю это имеет какое-то отношение к 'create',' show', 'update' и' destroy', которые по умолчанию сопоставляются со стандартными маршрутами REST в Rails. Если это действительно причина, то 'up_completion' и' down_completion' shouldn «Не работайте, просто« создавайте »,« показывать »,« обновлять »и« уничтожать ». Несмотря на это, вы не вызываете эти методы напрямую. Где-то вдоль линии AJAX почти наверняка задействован (или, может быть, websockets. Я сказал, что на самом деле я не знаком с Angular), это просто обрабатывается автоматически Angular. Просто замечание. – Ajedi32