2016-01-06 6 views
-1

Проблема: Я написал приложение 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'); 
}]); 

ли вызов функции неудачу, потому что я неправильно написал что-то или есть какой-то другой вопрос вообще?

+0

Вы не можете вызвать серверные функции из кода на стороне клиента. (Разрешение этого будет серьезной уязвимостью безопасности.) Вместо этого используйте запрос AJAX. – Ajedi32

+0

Тогда почему я могу назвать другие функции? в файле 'tasks_controller.rb' (т. е.' tasks.create', 'tasks.up_completion',' tasks.down_completion' (не показаны) и т. д.? –

+0

Touché. Я не знаком с Angular, но думаю это имеет какое-то отношение к 'create',' show', 'update' и' destroy', которые по умолчанию сопоставляются со стандартными маршрутами REST в Rails. Если это действительно причина, то 'up_completion' и' down_completion' shouldn «Не работайте, просто« создавайте »,« показывать »,« обновлять »и« уничтожать ». Несмотря на это, вы не вызываете эти методы напрямую. Где-то вдоль линии AJAX почти наверняка задействован (или, может быть, websockets. Я сказал, что на самом деле я не знаком с Angular), это просто обрабатывается автоматически Angular. Просто замечание. – Ajedi32

ответ

0

Вы должны проверить документацию на $resource. Предоставляются маршруты RESTful (таким образом, create, get и т. Д. Будут работать), но вам нужно явно определить дополнительные действия, которые вы будете отображать на маршруты, соответствующие действиям контроллера. Вы бы сделали примерно следующее:

app.factory('Tasks', ['$resource', function($resource) { 
return $resource('/tasks/:id', null, 
    { 
    'moveOrder': { method:'POST', url: 'route_to_your_action' }, 
    'otherAction': { url: 'route_to_your_action' } 
    }); 
}]); 
+0

Приносим извинения за отсутствие моего файла 'app.js'. Я добавил его выше –

+0

Извините, я предположил, что вы использовали $ resource ... В этом случае, где вы определяете task_id и pos в своем контроллере rails, в действии moveOrder? Разве вы не можете получить их из параметров запроса? – taglia

+0

Да, я не могу работать. Теперь я обманываю себя «$ resource», и, надеюсь, я это выясню. Были ли отсутствующие параметры причиной того, что функция не будет найдена? –

Смежные вопросы