2013-09-25 3 views
1

Я создал маршрут участника на ресурсе под названием groups в моем приложении Rails.404 для маршрута, который существует в соответствии с рейк-маршрутами

resources :groups do 
    member { post :vote } 
    end 

Если я разгребать маршрут, это показывает, что этот маршрут существует

vote_group POST /groups/:id/vote(.:format)  groups#vote 

В Эмбер, я создал GroupController

App.GroupController = Ember.ObjectController.extend({ 

    actions: { 

    vote: function() { 

    $.post("vote_group_path", { 
     username: this.get("username"), 
     id: this.get("id") 
    .... 

Однако, когда я нажимаю представить в форме, Я получаю ошибку в отсутствии маршрута

ActionController::RoutingError (No route matches [POST]"/vote_group_path"): 

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

<script type="text/x-handlebars" id="group"> 

     {{ model.name }} 
     {{ model.id }} 
     {{ partial 'groups/form'}} 

</script> 

, но я не знаю, как включить id для группы как своего рода скрытого элемента в виде (если это даже необходимо, чтобы сделать работу по маршруту)

<script type="text/x-handlebars" id="groups/_form"> 
<form class="form-horizontal" {{action "vote" on="submit"}}> 
    <div class="controls"> 
     {{input value=username type="text"}} 
    </div> 

    <button type="submit" class="btn">follow</button> 
</form> 
</script> 

Я знаю, что в конечном счете понадобится идентификатор группы в действии голосов контроллера группы, но я не уверен, если отсутствие идентификатора делает маршрут, как представляется, не существует

def vote 
    @group = Group.find(params[:id]) 
    ... 

ответ

2

Проблема в том, что vote_group_path является вспомогательным методом, созданным Rails, который может использоваться только в приложении Rails. Предположим, что у вас есть группа с id1, назначенная переменной some_group. Внутри приложения Rails, если вы вызываете vote_group_path(some_group), он вернет строку '/groups/1/vote'. Эта вспомогательная функция не пересекает границу прикладного уровня в вашем JavaScript. В JS вам нужно вручную построить полный путь от '/groups/1/vote'.

Что-то вроде:

$.post("/groups/" + this.get('id') + "/vote", {...}); 
Смежные вопросы